我正在(最终)从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 */
在我看来,这应该有效:
void serial_notready(void)
{
EscapeCommFunction(hSerial,CLRDTR);
EscapeCommFunction(hSerial,CLRRTS);
}
void serial_ready(void)
{
EscapeCommFunction(hSerial,SETDTR);
EscapeCommFunction(hSerial,SETRTS);
}
int serial_read(char reading[])
{
DWORD dwBytesRead = 0;
int nbytes=11;
ReadFile(hSerial, reading, nbytes, &dwBytesRead, NULL);
return(dwBytesRead);
}
serial_ready(void);
x = 0; while(x == 0){x=serial_read(reading);}
serial_notready(void);
但是,美能达不等待从电脑接收RTS。它只是继续并在每个变得可用时发送读数。与此同时,计算机不会拒绝任何不需要的阅读,但接受它。
我一直在靠墙试图解决这个问题,尝试各种排列无济于事。任何帮助非常感谢!
潜在的故事是我在显示器上呈现给定的亮度(亮度),然后需要相应的亮度读数。这是针对一整套亮度完成的。
L ---
U ---
M ---
TIME
我提出了lum1,lum2,lum3,lum4,....如果测量结果没有与显示器同步,那么我可能得到一个实际上是lum2的读数3,或某种平均值,因为读数越过了边界在lum2和lum3之间显示。而且,正如你所说,汉斯,读数总是落后于显示亮度。即使我总是系统地读一遍它也会很糟糕(我的情况更糟 - 它是读数和亮度之间的随机关系)。
因此,Windows串行例程的行为对我来说是一场噩梦。再次感谢您的帮助!
答案 0 :(得分:2)
dcbSerialParams.fDtrControl=DTR_CONTROL_ENABLE;
dcbSerialParams.fRtsControl=RTS_CONTROL_ENABLE;
您可以立即启用DTR和RTS信号。打开端口时,仪表将立即开始发送数据。该数据被缓冲在驱动程序的接收缓冲区中。在DOS代码中之前没有缓冲区。这取决于你调用serial_notready()需要多长时间。如果花费大约一秒左右,你将拥有一个非常完整的缓冲区。是的,这使得仪表看起来只是发送数据。你总是在读一个旧样本。
从DCB值设置为DISABLE开始。请注意该方案很脆弱,你可以在DOS下可靠地关闭信号。现在你有一个司机介于两者之间。你最终可能会把RTS关掉。哪个有可能获得陈旧的阅读。另一种方法是启动一个只能连续读取的线程。并让您的主要代码使用它读取的最后一个值。开销很低,串口很慢。
答案 1 :(得分:0)
要做的第一件事是检查对EscapeCommFunction()
的调用的返回值。如果返回值为is zero,则调用失败,您应使用GetLastError()
来接收更多错误信息。
答案 2 :(得分:0)
我使用免费的第三方串口模拟器VPS。它有一个间隔请求计时器,当需要更新/绘制数据时,它会激活。还允许我将总线包记录到excel文件中。