求救:为何readcond函数在接收串口数据时总是丢数?

我编写了一个程序利用readcond函数接收串口发送过来的82个数据,但是返回值大部分是82个,大部分时候是收到82个数,但是偶尔收到81、78甚至是77个数.也不知道是什么原因,哪位知道解释一下,谢谢了!
代码如下:
void *RecvFromSerialPort(void *arg)
{
int RecvID=1;
int i,n1,n2,nt,n;
int nbRecv=0;
int ModelState;

double mdldata[MAXRE];//MAX=128;
int mdldata_size;
struct data_in comdata;// struct data_in{unsigned char data[MAXRE]};
int comdata_size;
unsigned char tmp;

OpalGetNbAsyncRecvIcon(&nbRecv);
if(nbRecv >= 1)
{
do
{
RecvID = 1;
n=0;
nt=0;

memset(&comdata,0,sizeof(comdata));
comdata_size=sizeof(unsigned char)*82;

////////////////////////
n=readcond
(fd_ser,&comdata.data,comdata_size,comdata_size,0,50);
nt=n;
OpalPrint(“The receive data length is :%d\n”,(int)n);
for(i=0;i<nt;i++)
OpalPrint(“The data[%d] is %d\n”,i,comdata.data_);


}
}
}

一个比较奇怪的现象就是我利用计算机本身的串口来发送数据,这是我接收到的数据就是完全正确的,但是利用凌华的3544卡来发送数据,多部分时候接收到的数据数量是对的,偶尔只能接收到78、77或者81个数,也就是丢掉了一些数。我所用的是422协议。用计算机自带的串口发送是通过232转422来完成的。计算机自带的串口使用232协议也是没有问题的。

凌华的3544卡的运行结果是这样:
The receive data length is :82
The receive data length is :82
The receive data length is :82
The receive data length is :82
The receive data length is :78
The receive data length is :82
The receive data length is :87

不太有什么规律。
另外,使用MOXA CP-114的串口卡来发送数据,这是根本就不能正确接收数据,例如我发送的是78,则接收到的数要么是128要么是0.采用232协议。
使用MOXA的结果如下:
The data[0] is 0

The data[0] is 128

The data[0] is 0


总之使用计算机自带的串口就是对的,使用第三方的卡就不对。不知道是什么原因啊?是不是驱动的问题?我的QNX是6.2.1的。6.3.2也试过了,一样的现象。_

像网络丢包一样,串口丢字节也很正常吧。
应该不是readcond的问题。你可以确认一下。
至于为什么丢字节我就不知道了。
速率太快,线路过长…?

[url=http://www.qnx.com/developers/docs/6.3.2/neutrino/lib_ref/r/readcond.html]readcond的文档里有个表。你的调用方法是82个字节,或是0.5秒。所以返回少于82字节的时候,就是在0.5秒里没有收齐82字节(有时81, 有时77)

至于为什么会在0.5秒里收不齐,就要看具体情况了。有没有可能对方发得不够快?有没有可能硬件上被丢掉了?等等。

问题解决了,原来是驱动的问题,重新下载个驱动,问题就解决了。MOXA卡的驱动在MOXA的网站上有。使用系统自带的不可以。