下位機持續通過串口發送資料
如:0x00 0x80 0x1e 0xf2 0x00 0x80 0x15 0x32
這里是兩個資料幀,四個位元組為一個資料幀,協議中沒有任何校驗,幀頭和幀尾,就只是持續地發四個位元組的資料,我在PC上 用串口除錯助手測驗到資料讀取沒發生過錯誤。
如果在linux下串口讀資料,那么就會出現這種情況
如:0x00 0x80 0x1e 0xf2 0x00 0x00 0x80 0x15 0x32
就是在兩個資料幀之間多出了一個位元組,由于沒有幀頭幀尾加以判斷,在程式上無法判斷哪一個是非法的位元組,只能通過每四個位元組取一次資料,所以就導致后來的資料全部錯亂。
問題是為什么用程式讀就會出現這種錯誤呢。
串口初始化代碼如下
/*
初始化串口,配置串口的各種引數。
引數:BaudRate:波特率
DataBits:資料位
StopBits:停止位
ParityBit:校驗位
*/
bool SerialPort ::InitSerialPort(int BaudRate,int DataBits,int StopBits,int ParityBit)
{
if( -1 == fd)
return false;
if( 0!= tcgetattr (fd,&m_Setting))
{
printf("InitSerialPort tcgetattr() line:%d failed\n",__LINE__);
return false;
}
// 設定波特率
for(int i = 0 ; i<sizeof(m_SpeedArr)/sizeof(int);i++)
{
if( BaudRate == m_SpeedArr[i])
{
tcflush(fd, TCIOFLUSH); // 清空發送接識訓沖區
cfsetispeed(&m_Setting,m_BaudRateArr[i]); // 設定輸入波特率
cfsetospeed(&m_Setting,m_BaudRateArr[i]); // 設定輸出波特率
break;
}
if(i == sizeof(m_SpeedArr) / sizeof(int))
return false;
}
m_Setting.c_cflag |= CLOCAL;//控制模式, 保證程式不會成為埠的占有者
m_Setting.c_cflag |= CREAD; //控制模式, 使能埠讀取輸入的資料
// 設定資料位
m_Setting.c_cflag &= ~CSIZE;
switch(DataBits)
{
case 6:m_Setting.c_cflag |= CS6 ; break; //6位資料位
case 7:m_Setting.c_cflag |= CS7 ; break; //7位資料位
case 8:m_Setting.c_cflag |= CS8 ; break; //8位資料位
default:
fprintf(stderr,"unsupported dataBits\n");
return false;
}
// 設定停止位
switch(StopBits)
{
case 1: m_Setting.c_cflag &= ~CSTOPB;break; //1位停止位
case 2: m_Setting.c_cflag |= CSTOPB; break; //2位停止位
default:
return false;
}
// 設定奇偶校驗位
switch(ParityBit)
{
case 'n':
case 'N':
m_Setting.c_cflag &= ~PARENB; // 關閉c_cflag中的校驗位使能標志PARENB)
m_Setting.c_iflag &= ~INPCK; // 關閉輸入奇偶檢測
break;
case 'o':
case 'O':
m_Setting.c_cflag |= (PARODD | PARENB);//激活c_cflag中的校驗位使能標志PARENB,同時進行奇校驗
m_Setting.c_iflag |= INPCK; // 開啟輸入奇偶檢測
break;
case 'e':
case 'E':
m_Setting.c_cflag |= PARENB;//激活c_cflag中的校驗位使能標志PARENB
m_Setting.c_cflag &= ~PARODD;// 使用偶校驗
m_Setting.c_iflag |= INPCK;// 開啟輸入奇偶檢測
break;
case 's':
case 'S':
m_Setting.c_cflag &= ~PARENB; // 關閉c_cflag中的校驗位使能標志PARENB)
m_Setting.c_cflag &= ~CSTOPB; // 設定停止位位一位
break;
default:
fprintf(stderr,"unsupported parityBit\n");
return false;
}
m_Setting.c_oflag &= ~OPOST;// 設定為原始輸出模式
m_Setting.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 設定為原始輸入模式
m_Setting.c_cc[VTIME] = 1;
m_Setting.c_cc[VMIN] = 1;
m_Setting.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
tcflush(fd, TCIFLUSH);
// 激活配置
if( 0 != tcsetattr(fd,TCSANOW,&m_Setting))
{
printf("InitSerialPort tecsetattr() %d failed\n",__LINE__);
return false;
}
return true;
}
uj5u.com熱心網友回復:
兩個資料幀多出來的那一個位元組有時候會出現,有時候就不會出現,有時候還會出現兩個,不知道是讀多了資料還是資料丟失了轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/27868.html
標籤:應用程序開發區
