modbus数据协议传输的纠结

	数据传输过程的纠结在于在测试stm32时protues的接收出现了问题,多数据传输格式出现了错误。本来以为是程序出现了错误,后来研究了一天,所以的可能都试了,但还是不能接收多数据,但数据接收可以正常运行。
	现有一种数据流的方式来改变这种状态。`///取出数据并检查数据准确性

void UART_Task(void)
{
static uint8_t uartDataBuf = 0;
if(RingBuf_U8_Read(&RxUartBuffer,&uartDataBuf)!=0 && gUartStatus.TXComplete == true) //从队列中取出一个数据(必须等待数据发送完成)
{
switch(gUartStatus.RXStatus)
{
case 0: // 检查是否是A5起始符

  	  if(uartDataBuf == 0xa5)
			{
				memset(gUartStatus.UART_RX_Buffer,0x00,sizeof(gUartStatus.UART_RX_Buffer));//清空数组
				gUartStatus.RXStatus = 0x01;	
  	  		  		// 初始化接收设备端信息进程
				gUartStatus.RXSp = 0x00;
				gUartStatus.UART_RX_Buffer[gUartStatus.RXSp] = uartDataBuf;
				gUartStatus.RXSum = gUartStatus.UART_RX_Buffer[gUartStatus.RXSp];
  	  }
  	  break;
  		
  	case 1:
  		
  	    gUartStatus.RXSp++;
  	    gUartStatus.RXLenth = gUartStatus.UART_RX_Buffer[gUartStatus.RXSp] = uartDataBuf;
  					// 获取设备端返回信息数据流的有效长度
  	    gUartStatus.RXSum = gUartStatus.RXSum + gUartStatus.UART_RX_Buffer[gUartStatus.RXSp];
  	    gUartStatus.RXStatus = 0x02;
  	    break;
  			
  	case 2:
  		
  	    gUartStatus.RXSp++;
  	    gUartStatus.UART_RX_Buffer[gUartStatus.RXSp] = uartDataBuf;
  					// 校验是否属于正常数据流
  	    if((gUartStatus.RXLenth - 0x03) == gUartStatus.UART_RX_Buffer[gUartStatus.RXSp])
  	    {									
					gUartStatus.RXSum = gUartStatus.RXSum + gUartStatus.UART_RX_Buffer[gUartStatus.RXSp];
					gUartStatus.RXStatus = 0x03;
  	    }
  	    else			// 2、3字节矛盾,属于非正常数据流
  	    {
					gUartStatus.RXStatus = 0x00;	
  			  		// 复位接收设备端信息进程
  	    }
  	    break;
  		
  	case 3:
  		
  	    gUartStatus.RXSp++;
  	    gUartStatus.UART_RX_Buffer[gUartStatus.RXSp] = uartDataBuf;
  	    gUartStatus.RXSum = gUartStatus.RXSum + gUartStatus.UART_RX_Buffer[gUartStatus.RXSp];
  					// 判断是否已经接收完有效数据字节
  	    if(gUartStatus.RXSp >= gUartStatus.RXLenth - 0x02)			
  	    { 
					gUartStatus.RXStatus = 0x04;
				}
  	    break;
  			
	case 4:
  			
  	    gUartStatus.RXStatus = 0x00;// 结束进程,如果还有填充“0”到来也不再理睬
  					// 检查累加和校验是否正确
  	    if(gUartStatus.RXSum == uartDataBuf)
  	    {
					gUartStatus.RXSp++;
					gUartStatus.UART_RX_Buffer[gUartStatus.RXSp] = uartDataBuf;
					Uart_Receive_Message();													// 解析信息
  	    }
  	    break;
  	    
  	 default:
  	    break;
  	    
	}
}

}
理论上来讲数据流的方式更适合数据传输,使用buffer也能解决数据的缓存问题,但是目前不确定是否符合modbus的协议,在协议中有定义延时时间。现在先用51来做一个modbus的方案,到时候再来看stm32的数据流形式的问题。
基本上找了一圈modbus的代码都是用接收数据串的方式。等研究好了再来

modbus数据协议传输的纠结modbus数据协议传输的纠结 weixin_45983966 发布了2 篇原创文章 · 获赞 0 · 访问量 14 私信 关注
上一篇:基于FPGA通用异步收发器UART设计


下一篇:016-1 模块-模块的加载顺序、导入执行流程