TIM

关于串口接受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怎么实现


已邀请:

乌龟也会飞

赞同来自: Ririe Ping

第一步、在cubeMX中配置串口数据传输为9位数据格式,然后生成代码

image.png

第二步,更改代码

(1)首先查看代码配置中确实为9位的数据格式

image.png

(2)更改结构体UART_HandleTypeDef数据类型中接受数据格式为uint16_t *

image.png

(3)更改串口中断接受函数原型将原来的uint8_t 改为uint16_t ,同时注意对应的头文件中该函数的原型申明也要进行同步更改

image.png

image.png

由于我测试未使用DMA,把库函数中有个接受DMA的函数同步更改或者注释掉

image.png

3、定义全局变量作为接受缓冲

image.png

4、开启串口接受中断

image.png

5、实现串口接受中断回调函数

image.png

6、编译下载进入debug模式,并将rxData添加到watch窗口

image.png

7、连接串口到上位机开始发送数据,由于使用的是串口调试助手不能发送9位数据格式的数据信息,故此采用奇偶校验位来模拟9位数据中的第9位

image.png

8、数据发送位0x32添加第9位由于第9位采用的奇偶检验模拟且为偶校验,那么下位机如果接受成功的话数据应该为0x132

返回debug窗口查看结果

image.png

可以得出与预期的结果是相符合的,因为验证只更改了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位吗?有测试过吗?


要回复问题请先登录注册