关于串口接受9位字长的问题
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)这个函数好像只支持8位长度,
不像标准库接受的大小为u16 怎么在hal中判断接受到的第九位数据
类似标准库判断RXB8,标准库代码如下:
UDR = USART_ReceiveData(USART1);RXB8 = (UDR & 0x0100);
现在问题是 我在hal怎么实现
4 个回复
乌龟也会飞
赞同来自: Ririe 、Ping 、lifeng5478
第一步、在cubeMX中配置串口数据传输为9位数据格式,然后生成代码
第二步,更改代码
(1)首先查看代码配置中确实为9位的数据格式
(2)更改结构体UART_HandleTypeDef数据类型中接受数据格式为uint16_t *
(3)更改串口中断接受函数原型将原来的uint8_t 改为uint16_t ,同时注意对应的头文件中该函数的原型申明也要进行同步更改
由于我测试未使用DMA,把库函数中有个接受DMA的函数同步更改或者注释掉
3、定义全局变量作为接受缓冲
4、开启串口接受中断
5、实现串口接受中断回调函数
6、编译下载进入debug模式,并将rxData添加到watch窗口
7、连接串口到上位机开始发送数据,由于使用的是串口调试助手不能发送9位数据格式的数据信息,故此采用奇偶校验位来模拟9位数据中的第9位
8、数据发送位0x32添加第9位由于第9位采用的奇偶检验模拟且为偶校验,那么下位机如果接受成功的话数据应该为0x132
返回debug窗口查看结果
可以得出与预期的结果是相符合的,因为验证只更改了HAL的接受部分,如果也需要使用发送9位的数据格式那么按照接受的部分更改即可
Ririe - 90
赞同来自:
自带腹肌的西装
赞同来自:
库函数这里它是一个uint8 的指针,所以即使你传16位的数据他也可以读取的,使用(uint8*)((uint16)data),不过有个数据大小端的问题,需要检测一下。然后确定接收到的数据进行相应的处理就行
void ReadEEPROM(u32 u32Addr,u16 u16Offset,u8 *Pu8Buf,u16 u16Len)
{
if(u16Offset)
{
u32Addr+=u16Offset;
}
while(u16Len--)
*Pu8Buf++=*(u8*)u32Addr++;
}
ごlaughter↙
赞同来自:
DMA可以读取9位吗?有测试过吗?