数据传输过程的纠结在于在测试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的代码都是用接收数据串的方式。等研究好了再来