stm32如何完美的与串口屏通讯

老孟家的孩子 2019-08-18 02:37:22
要求:
1、单片机会实时的给串口屏幕发送数据,(延迟比较小)
2、屏幕会不定时的给单片机发送数据
假如在单片机给屏幕发送数据时候。屏幕会发送一条数据给单片机。 此时串口通道堵塞。
这种情况该如何解决。我在单片机接收的也判断的传串口当前的状态。
各位大哥们,请指教一下小弟呀。 谢谢各位了。
...全文
1199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_sf1168 2020-02-27
  • 打赏
  • 举报
回复
收发都用FIFO加DMA
老孟家的孩子 2019-08-18
  • 打赏
  • 举报
回复
我现在也是用的接收中断, 中断是这样子写的
if(UartHandle->Instance == USART3)
{
uint8_t ret = HAL_OK;
msg++;
len_u4++;//数据长度计数
if( msg == msg_buff + MAX_RECV_LEN)
{
msg = msg_buff;
}
do
{
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
}while(ret != HAL_OK);
if(*(msg-1) == '\n') //接收以\n为结尾字符,则表示接收完成
{
flag = 1;
}
}



然后在主循环中

void App_recv_data(void)
{
if(flag == 1)
{
memset(msg_buff, 0, sizeof(msg_buff)); //清空缓存区
// 指向接收缓存的头部
msg = msg_buff;
(&huart3)->pRxBuffPtr = msg;
flag = 0;
len_u4=0;//每次数据长度清0
}
HAL_Delay(100);
}

请问我这样写合适吗?
Acuity. 2019-08-18
  • 打赏
  • 举报
回复
串口是全双工的,何来阻塞。
hhhh63 2019-08-18
  • 打赏
  • 举报
回复
循环发送和接收吧
JOY_shiyue 2019-08-18
  • 打赏
  • 举报
回复
引用 楼主 孟家五公子的回复:
要求:
1、单片机会实时的给串口屏幕发送数据,(延迟比较小)
2、屏幕会不定时的给单片机发送数据
假如在单片机给屏幕发送数据时候。屏幕会发送一条数据给单片机。 此时串口通道堵塞。
这种情况该如何解决。我在单片机接收的也判断的传串口当前的状态。
各位大哥们,请指教一下小弟呀。 谢谢各位了。
不是有中断么!Rx可以用中断
Haiguozhe 2019-08-18
  • 打赏
  • 举报
回复
你要用查询视式,中断中死等,不阻塞才怪
狗蛋王-yo 2019-08-18
  • 打赏
  • 举报
回复
串口接收的写法逻辑,正确的应该是,你的串口硬件本身已经收到了一个数据,并且产生了中断。
这时,进入中断中,将SBUF里的数据拷贝到内存中,然后退出中断,其他啥事都不要做。
狗蛋王-yo 2019-08-18
  • 打赏
  • 举报
回复
串口是全异步双工通信协议,发的时候收,为什么会阻塞?发和收不影响。
do
{
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
}while(ret != HAL_OK);
if(*(msg-1) == '\n') //接收以\n为结尾字符,则表示接收完成
{
flag = 1;
}
你这样写,会严重影响中断。中断要求快进快出,你都把中断压死了,要是你串口某个时间节点掉了,正好在中断里,它永远收不到信息,你的单片机就死机了



27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧