Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
串行设备忽略带C的EscapeComm函数_C_Winapi_Serial Port - Fatal编程技术网

串行设备忽略带C的EscapeComm函数

串行设备忽略带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;

我终于从MSDOS迁移到Windows XP,通过串行端口控制仪表。我的旧C-DOS代码运行良好

我想做如下工作:

仪表持续读取读数 每隔几秒钟,但不发送任何 信息,直到 计算机 当计算机准备好接收 来自仪表的信息,它请求它。它不接受其他信息。 我的问题是,读数只是进入计算机,因为它们是由仪表生成的

我已将DCB serail参数设置如下,旨在使用RTS和DTR控制通信:

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;