串口接收助手发送超位的问题

发布: 2010-1-11 20:49 | 作者: 06082314 | 来源: StmFans思蜕盟 OPELC 自由电子联盟

串口中断函数如下:
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
    RxBuffer[ RxCounter ] = USART_ReceiveData(USART1);   
    //如果接收的长度为0xfe或以上
    if( RxCounter == 0x04 || '#'== RxBuffer[ RxCounter ] )
    {
      /* Disable the USART1 Receive interrupt */
      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
      UartHaveData = 1;
    }   
    RxCounter++;
  }   
}
主函数循环当中:
  while (1)
  {
    Uart1_PutString("a");
    Delay_Ms(1000);
    /* Receive a string (Max RxBufferSize bytes) from the Hyperterminal ended by '\r' (Enter key) */
    if( 1 == UartHaveData )
    {
      Uart1_PutString(RxBuffer);//Uart1_SendString( RxBuffer , RxCounter );
      RxCounter = 0;
      UartHaveData = 0;      
     // Enable USART1 Receive and Transmit interrupts
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);      
    }
  }
问题是这样的,当用串口调试助手发送的数据超过0x04时,串口调试助手不能正常的显示前面的0x04位;
如果我想让串口调试助手正常的显示前面发送的0x04位,应该怎么改,自己改了一下午还是不行,请高手指点
是不是的在那儿加一句检测接收数据非空标志位呢?
trinove (2010-1-11 22:22:30)
楼主 用的是232 还是485呢?
trinove (2010-1-11 22:24:16)
或者说,通讯线路是全双工的还是半双工的?
如果是半双工的,下面接收到4个,就开始回传,而这个时候,上位机还在继续向下传送,那么,是不会接收数据的,直到上位机发送完成,才会开始接收数据,这个时候,早先发送的几个数据应该都已经错失掉了。
binglin (2010-1-11 23:03:10)

CODE:

if( RxCounter == 0x04 || '#'== RxBuffer[ RxCounter ] )
    {
      /* Disable the USART1 Receive interrupt */
      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
      UartHaveData = 1;
    }   
由你给出的代码简单分析就可以看出,你的程序的接收及发送逻辑分析如下:
当接收RxCounter 为0x04时,也就是说当接收了四个数据或收到‘#“的字节后,你的程序就会关闭串口的中断,这时你再发数据下位机当然也就不会收到了,它要等你把收到的四个数据发回给上位机后才再打开串口的接收中断才继续接收,简单地说就在你的接收中断关才后直到重新打开中断这段时间内(还要加上你的延时函数的延时时间),上位机发往下位机的数据就会全部掉失。

直接地说吧,串口通信程序不应该这样编写,最起码你要清楚你要想做的是什么,确定好上/下位机的通信协议再编写程序。
06082314 (2010-1-12 09:06:29)
4# binglin


原来是这样啊,学习历程的时候就是突然想到:要是上位机发送的数据超出时还没有接收到最后的停止位“#”时,那该怎么办,我想就把前0x04位发回到上位机,可是发回到上位机的数据不是发送的前0x04位,但听了斑竹的话我好像明白了这样做是不对的,看来还得学习学习协议的问题~~~~
binglin (2010-1-12 11:23:12)
这就是通信协议为什么这么重要的原因了,所谓通信协议就是上/下位机之间数据交换的规则约定。

出现意外时怎么处理,这部份内容本身就是通信协议的组成部份之一(出错处理)。

“要是上位机发送的数据超出时还没有接收到最后的停止位“#”时,那该怎么办”,你要做是如何保证上位出发出来的数据符合你制定的协议,当出现错误(误码等)下位机要做的一件事就是抛弃所收到的数据并根据需要请求上位机重发。