你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于串口接收的若干问题

[复制链接]
tryfly 提问时间:2019-7-25 09:43 /
环境:HAL库
1,我花了好久,终于实现了串口发送+串口中断DMA接收发送没问题,但是接收只能在MY_UART_IDLECallback或者MY_UART_IRQHandler里面得到数据,
请问我怎么在main函数主程序里面得到接收数据?比如弄个函数uint8_t *get_string(void);实现我一调用就返回新得到的字符串?

2,是不是中断只能设置一个全局的rev_string变量来存储在中断函数中收到的数据?然后再main函数里面直接读rev_sting这个变量?
但是我要写协议,一会收一会发,对面还会根据我的应答回复不同的东西,比如我发送down,对面回复我一个OK,我怎么在发送了down之后,判断收到了OK呢?
是不是收到的rev_sting变量,判断一次后,为了让他能收到新数据,我要在判断函数的末尾把rev_string清空?
那有没有可能,我正在清空呢比如用memset(rev_string,0,len),这个时候又来新数据,我刚好收不到怎么办?

3,HAL_UART_Transmit这函数要写timeout,请问这个超时时间是什么意思呢?是里面延时时间吗?
4,HAL_UART_Transmit_DMA这个函数就不要timeout。。。
我在main的while里面写的如下,大家帮我看一下对不对呗,\r会被识别为\0吗,真的好困惑,头一次写串口这种来回应答的协议,我连接收怎么处理都不知道。。。
  1. if(bootcnt<100)
  2.     {
  3.       bootcnt++;
  4.                         HAL_UART_Transmit(&huart1, getdown, 10,10);
  5.                         if(strstr((const char *)receive_buff,"update_fw"))
  6.                         {
  7.                                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  8.                                 memset(receive_buff,0,data_length_main);//清空接收的数据
  9.                                 HAL_UART_Transmit(&huart1,resultok,16,10);
  10.                                 if(strstr((const char *)receive_buff,"ok")!=NULL)
  11.                           {
  12.                                         Serial_PutByte(NAK);
  13.                                         if(1)//如果串口有数据,那么开始执行xmodem接收,不知道怎么判断
  14.                                         {
  15.                                                 //此处应该判断数据包是否符合xmodem协议,但是我没有判断,直接当作来的数据就是xmodem的数据
  16.                                                 if(Xmodem_Receive()==HAL_OK)
  17.                                                 {
  18.                                                 }                        
  19.                                         }
  20.                           }
  21.                         }
  22.                 }
复制代码
  1. HAL_StatusTypeDef Serial_PutByte(uint8_t param)
  2. {
  3.   if ( HAL_UART_STATE_TIMEOUT ==HAL_UART_GetState(&UartHandle))
  4.     {HAL_UART_Abort(&UartHandle);}//中止正在进行的传输,阻塞模式
  5.           return HAL_UART_Transmit(&UartHandle, ¶m, 1, TX_TIMEOUT);
  6. }
复制代码
  1. void Serial_PutString(uint8_t *p_string)
  2. {
  3.   uint16_t length = 0;
  4.   while (p_string[length] != '\0')
  5.   { length++;}
  6.   HAL_UART_Transmit(&UartHandle, p_string, length, TX_TIMEOUT);
  7. }
复制代码
  1. uint8_t get_char()
  2. {
  3.         uint8_t ch;
  4.         if( HAL_UART_STATE_RESET ==HAL_UART_GetState(&UartHandle))
  5.         {HAL_UART_Receive(&huart1,&ch,1,RX_TIMEOUT);}
  6.         return ch;
  7. }
  8. HAL_StatusTypeDef get_string(uint8_t *pstring)
  9. {
  10.         uint16_t len=0;
  11.         uint8_t ch;
  12.         while((ch=get_char())!='\0')
  13.         {pstring[len++]=ch;}
  14.         return HAL_OK;
  15. }
复制代码






收藏 评论1 发布时间:2019-7-25 09:43

举报

1个回答
wenyangzeng 回答时间:2019-7-25 10:40:08
既然配置了串口中断接收,当然只能在中断函数里读数据了,如果要在主循环函数里查询接收,就应该配置成接收不使用中断了。ST官方演示有查询接收、中断接收等可以参考:

UART.rar (184.9 KB, 下载次数: 4)

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版