串行设备忽略带C的EscapeComm函数
我终于从MSDOS迁移到Windows XP,通过串行端口控制仪表。我的旧C-DOS代码运行良好 我想做如下工作: 仪表持续读取读数 每隔几秒钟,但不发送任何 信息,直到 计算机 当计算机准备好接收 来自仪表的信息,它请求它。它不接受其他信息。 我的问题是,读数只是进入计算机,因为它们是由仪表生成的 我已将DCB serail参数设置如下,旨在使用RTS和DTR控制通信:串行设备忽略带C的EscapeComm函数,c,winapi,serial-port,C,Winapi,Serial Port,我终于从MSDOS迁移到Windows XP,通过串行端口控制仪表。我的旧C-DOS代码运行良好 我想做如下工作: 仪表持续读取读数 每隔几秒钟,但不发送任何 信息,直到 计算机 当计算机准备好接收 来自仪表的信息,它请求它。它不接受其他信息。 我的问题是,读数只是进入计算机,因为它们是由仪表生成的 我已将DCB serail参数设置如下,旨在使用RTS和DTR控制通信: dcbSerialParams.BaudRate=CBR_4800; dcbSerialParams.ByteSize=7;
dcbSerialParams.BaudRate=CBR_4800;
dcbSerialParams.ByteSize=7;
dcbSerialParams.StopBits=TWOSTOPBITS;
dcbSerialParams.Parity=EVENPARITY;
dcbSerialParams.fDtrControl=DTR_CONTROL_ENABLE;
dcbSerialParams.fRtsControl=RTS_CONTROL_ENABLE;
我在DOS下的旧代码如下:
outportb(COM1+4,0x03); /* start Minolta reading */
for(j=0;j<=10;j++) /*each reading consists of 11 ascii characters*/
{
while(!((inportb(COM1+5)) & 1)); /*wait until char received*/
reading[j]=inportb(COM1);
}
sscanf ( &reading[4], "%f", &lum[k] );
outportb(COM1+4,0x00); /* stop Minolta reading */
但是,美能达不会等待从计算机接收RTS。当每一个都可用时,它只是继续并发送读数。同时,计算机不会拒绝任何不需要的读取,而是接受它
我一直把头撞在墙上,试图弄明白这一点,尝试了各种各样的排列,但都无济于事。非常感谢您的帮助
更新:
基本情况是,我在显示器上显示给定的亮度,然后需要相应的亮度读数。这是针对一整套亮度进行的
L ---
U ---
M ---
TIME
我呈现lum1,lum2,lum3,lum4,。。。。如果测量结果与显示器不同步,那么我可能会得到一个假定读数3,实际上是lum2,或者某种平均值,因为读数跨越了lum2和lum3显示器之间的边界。正如你所说,汉斯,读数总是落后于显示器的亮度。即使我总是有系统地在后面读一次,那也不好,我的情况更糟——这是阅读和亮度之间的随机关系
因此,windows串行例程的行为对我来说是一场噩梦。再次感谢你的帮助 要做的第一件事是检查EscapeComm函数调用的返回值。如果返回值为0,则调用失败,您应该使用GetLastError接收更多错误信息。首先要做的是检查EscapeComm函数调用的返回值。如果返回值为,则调用失败,应使用GetLastError接收更多错误信息
dcbSerialParams.fDtrControl=DTR_CONTROL_ENABLE;
dcbSerialParams.fRtsControl=RTS_CONTROL_ENABLE;
您可以立即启用DTR和RTS信号。当您打开端口时,仪表将立即开始发送数据。该数据在驱动程序的接收缓冲区中得到缓冲。您以前在DOS代码中没有缓冲区。这取决于您呼叫serial_notready需要多长时间。如果这需要一秒钟左右的时间,你会有一个相当满的缓冲区。是的,这让它看起来像是仪表在发送数据。你总是在读一个老样本
从设置为禁用的DCB值开始。请注意,该方案是脆弱的,您可以在DOS中非常可靠地关闭信号。现在你有一个司机在中间。你可能会很晚才关掉RTS。这就有可能让阅读变得陈旧。另一种方法是启动一个只连续读取的线程。让主代码只使用它读取的最后一个值。开销很低,串行端口速度很慢
您可以立即启用DTR和RTS信号。当您打开端口时,仪表将立即开始发送数据。该数据在驱动程序的接收缓冲区中得到缓冲。您以前在DOS代码中没有缓冲区。这取决于您呼叫serial_notready需要多长时间。如果这需要一秒钟左右的时间,你会有一个相当满的缓冲区。是的,这让它看起来像是仪表在发送数据。你总是在读一个老样本
从设置为禁用的DCB值开始。请注意,该方案是脆弱的,您可以在DOS中非常可靠地关闭信号。现在你有一个司机在中间。你可能会很晚才关掉RTS。这就有可能让阅读变得陈旧。另一种方法是启动一个只连续读取的线程。让主代码只使用它读取的最后一个值。开销很低,串口速度很慢。我使用免费的第三方串口仿真器VPS。它有一个间隔请求计时器,可以在数据需要更新/抓图时进行检测。还允许我将总线数据包记录到excel文件中 我使用免费的第三方串行端口仿真器VPS。它有一个间隔请求计时器,可以在数据需要更新/抓图时进行检测。还允许我将总线数据包记录到excel文件中 非常感谢汉斯!我会跟进你的建议。非常感谢汉斯!我会跟进你的建议。谢谢你的回复。实际上,我不认为有错误,只要赢得串行通信例程就可以了,这些例程不能像我希望/期望的那样工作。比尔:谢谢某物的帮助。实际上,我不认为有错误,只要赢得串行通信例程就可以了,这些例程不能像我希望/期望的那样工作。比尔:谢谢,伊桑,我去看看。谢谢,伊桑,我 我去看看。
dcbSerialParams.fDtrControl=DTR_CONTROL_ENABLE;
dcbSerialParams.fRtsControl=RTS_CONTROL_ENABLE;