linux 串口输出异常,Linux下的串口通信异常?

我正在使用选择呼叫与外部子系统(使用串行端口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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值