我正在使用选择呼叫与外部子系统(使用串行端口RS232与Qt线程提供并实现相同的协议)进行通信。我们没有外部系统的硬件,因此我们使用.Net 2.0和C#开发了内部模拟器,以模拟底层子系统硬件的行为。有5个不同的子系统与我们的应用程序进行通信。子系统的每个接口都是以Qt线程的形式实现的。由于这不是一个实时应用程序,当我们使用模拟器进行通信时,我们没有实际的硬件,所以所有的系统都会在24小时左右发现,之后通信会上下移动,最终会导致所有通信中断,但当我在不关闭应用程序的情况下重新启动模拟器时,事情就会好起来。为什么会发生?我的猜测是,因为.Net/C#不是一个实时框架,并且在仿真器运行24小时后,数据发送速率开始变慢,串行端口堵塞;重新启动刷新一切,因此一切恢复正常。这只是一个猜测。如果有人有更好的意见,请分享。请注意,这些模拟器是由一个不同的.Net小组组成的。Linux下的串口通信异常?
注意:每个协议有不同的数据速率,1 Hz,5 Hz,10 Hz。
有一个系统即使在模拟器重新启动后重新启动后也不会恢复通信。该系统的端口配置是
SetPortConfiguration()
{
tcgetattr(Fd,&mOldtio);
mNewtio.c_cflag = B4800 | CS8 | CLOCAL | CREAD | CRTSCTS;
mNewtio.c_iflag = 0; //setting the input flag to icrnl causes a blank frame to be displayed after every frame.
mNewtio.c_oflag = 0;
mNewtio.c_lflag =ICANON;
mNewtio.c_cflag &=~PARENB;
mNewtio.c_cflag &= ~CSTOPB;
//mNewtio.c_cflag &= ~HUPCL; //added on 24/3/09
mNewtio.c_cc[VEOL]=0; //setting VEOL to '\r' or '\n' causes a blank frame to be displayed after every frame.
mNewtio.c_cc[VKILL] = 0; /* @ */
mNewtio.c_cc[VSTART] = 0; /* Ctrl-q */
mNewtio.c_cc[VSTOP] = 0; /* Ctrl-s */
mNewtio.c_cc[VMIN]=0;
mNewtio.c_cc[VTIME]=0;
tcflush(Fd, TCIFLUSH);
tcflow(Fd,TCION);
tcsetattr(Fd,TCSANOW,&mNewtio);
}
也有一个复位端口功能:
ResetPort()
{
tcflush(Fd, TCIFLUSH); //flush all data received but not read
tcflow(Fd,TCIOFF); //transmits a STOP character, which stops the terminal device from transmitting data to the system
tcsetattr(Fd, TCSANOW, &mOldtio);//set the old terminal settings
ClosePort(); //close port
OpenPort(mStrPortNo); //open the port specified by port number and in read mode
SetPortConfiguration();
}
如果在通信中的任何断裂,我调用其关闭并重新打开该端口的ResetPort功能。这解决了所有情况下的问题,只有一个系统说XYZ。 XYZ系统以NMEA格式发送每个数据包的数据,作为以回车符,换行符组合结尾的一串数据。
任何想法的人可能是什么问题?
+0
你需要更清楚;我不清楚接收系统是连接到同一端口上的所有五个子系统,还是每个子系统都有一个专用串行端口。我会假设后者,因为串口是点对点的并且不容易共享,但是如果在问题中明确表示,那将是很好的。 –
2009-07-16 08:53:13