如何使用串口发送和接收16位数据

1.问题背景

        对于串口的使用,在大多数时候一帧都是10位,也就是10bit(一位起始一位停止和八位数据)。那么发一帧的大小范围就是0~255,但是如果我要发送几千几万大小的数怎么办呢?很明显一帧解决进不了那就两帧,这样就可以发送0~65535这个范围的数了。

2.发送16位数据

如下这个代码是1个字节发送,最大255。(这个函数前面的参数表示是哪个串口,后面是数据,重点知道这个函数是向DR寄存器写数据的就行了)

void uart_write_byte (uart_index_enum uart_n, const uint8 dat)
{
    uart_index[uart_n]->TDR = dat;                                              // 写入发送数据
    while(!(uart_index[uart_n]->CSR & (0x00000001)));                           // 等待发送完成
}

然后这个是将一个16位的数拆分为一个高八位和一个低八位的函数:

/*************************************************************
*数据转换,将一个16位的数据转化为一个高八位和一个低八位的数据。
**************************************************************/
void data_conver(uint8 *high_data,uint8 *low_data,uint16 my_data)
{
		 *high_data= (my_data >> 8) & 0xff;  //高八位
		 *low_data= my_data & 0xff;         //低八位
}

举个例子,十进制的500经过(500 >> 8) & 0xff后十进制就是1,经过500 & 0xff后十进制是244。

那么实际上我发送的500如下:

/*************************************************************
*数据转换,将一个16位的数据转化为一个高八位和一个低八位的数据。
**************************************************************/
void data_conver(uint8 *high_data,uint8 *low_data,uint16 my_data)
{
		 *high_data= (my_data >> 8) & 0xff;  //高八位
		 *low_data= my_data & 0xff;         //低八位
}

void uart_write_byte (uart_index_enum uart_n, const uint8 dat)
{
    uart_index[uart_n]->TDR = dat;                                              // 写入发送数据
    while(!(uart_index[uart_n]->CSR & (0x00000001)));                           // 等待发送完成
}

int main()
{
    uint16 my_data = 500;
    uint8 h_data = 0;
    uint8 l_data = 0;

    while(1)
    {
        data_conver(&h_data,&l_data,my_data);
        uart_write_byte(UART1,h_data);
        uart_write_byte(UART1,l_data);
    }
}

h_data = 1,l_data = 244。

接收16位数据

说完发送,然后就是接收了。直接上代码:

//这里就不贴里面具体的了,只需要知道这个是接收一个数据的,前面是串口号,后面是接收到的数据。
uint8 uart_query_byte (uart_index_enum uart_n, uint8 *dat);

uint8 get_data[2];
//这里是中断接收,因为要接收两个数据,使用是小于2,大于等于2清零。
void uart_rx_interrupt (void)
{
    
    if(num < 2)
    {
         uart_query_byte(UART_1,&get_data[num]);
    }
    num++;
    if(num >= 2) num = 0;
}

//然后重点来了,这里就是将得到的两个8位数据合并成16位数据
  uint16 my_data = (get_data[0] << 8) | get_data[1];

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值