pywmiss 发表于 2024-4-4 23:15

请教一个单片机串口接收数据的问题

本帖最后由 pywmiss 于 2024-4-4 23:23 编辑

最近用一个产品,控制器和接收端都是同一个单片机(PY32F002A),无外置晶振。单片机控制器上用串口定时100ms发送一串数据9字节,1,使用电脑的串口助手接收,控制器发的数据是正常的。用轮询等待的方式接收的话,也能看到正确的数据
2,在接收端如果使用UART中断接收的方式,第一次数据都能正常接收完整的9个字节,之后就很难接收到完整的数据
这是什么呢???


pywmiss 发表于 2024-4-5 09:18

本帖最后由 pywmiss 于 2024-4-5 09:29 编辑

这个是用HAL库的程序 HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 9);
我原来以为只要中断生效,接收到9个字节直接在回调函数处理void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)数据使用就好了
现在的情况是不行,已经改成在中断一个字节一个字节接收然后处理了。但也很奇怪,现在一般第一条指令都能正常接收。后面的就接收不正常了
这里是需要做延时吗??我现在是使用STLINK连接实物板仿真进行确认参数的,在运行后停止来看数据。数据都不对。

pywmiss 发表于 2024-4-5 10:30

因为使用中断的一直不能正常,所以我改成了下面轮询的方式接收20字节的数据 然后把数据取出来使用
   /*通过POLLING方式接收数据*/
HAL_UART_Receive(&UartHandle, (uint8_t *)aRxBuffer, 20, 500);
目前接收功能是正常的。。
但是就是不明白为什么中断的方法不行

pywmiss 发表于 2024-4-5 11:58

这个串口问题卡了好几天,哎,,,终于搞定了,看到了一个帖子,只要把标志位清除就可防 了
        __HAL_UART_CLEAR_OREFLAG(&UartHandle);
        __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_RXNE);       

ayb_ice 发表于 2024-4-7 08:37

中断接收完成后,需要再次调用那个函数

WoodData 发表于 2024-4-7 15:43

中断接收完了,要再次调用这个继续接收 HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 9);

pywmiss 发表于 2024-4-11 20:29

WoodData 发表于 2024-4-7 15:43
中断接收完了,要再次调用这个继续接收 HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 9); ...

谢谢回复,现在用单字节接收先处理了

pywmiss 发表于 2024-4-11 20:29

ayb_ice 发表于 2024-4-7 08:37
中断接收完成后,需要再次调用那个函数

感谢回复
32的单片机用起来很不习惯,之前都是用51的

ayb_ice 发表于 2024-4-12 09:58

pywmiss 发表于 2024-4-11 20:29
感谢回复
32的单片机用起来很不习惯,之前都是用51的

用惯了,还不想回到51了
页: [1]
查看完整版本: 请教一个单片机串口接收数据的问题