【发布时间】:2011-06-13 16:56:57
【问题描述】:
我正在(最终)从 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);
但是,Minolta 不会等待从计算机接收 RTS。它只是继续并在每个可用时发送读数。同时,计算机不会拒绝任何不需要的阅读,而是接受它。
我一直把头撞在墙上试图弄清楚这一点,尝试了各种排列都无济于事。非常感谢任何帮助!
更新:
基本故事是我在显示器上呈现给定的亮度(亮度),然后需要相应的亮度读数。这是针对一整套亮度完成的。
L ---
U ---
M ---
TIME
我呈现 lum1, lum2, lum3, lum4,.... 如果测量值与显示器不同步,那么我可能会得到一个假定的读数 3,它实际上是 lum2,或者某种平均值,因为读数越过了边界在 lum2 和 lum3 显示器之间。而且,正如您所说,汉斯,读数总是落后于显示亮度。即使我总是系统地落后于一个读数也会很糟糕(我的情况更糟 - 这是读数和亮度之间的随机关系)。
所以 windows 串行例程的行为对我来说是一场噩梦。再次感谢您的帮助!
【问题讨论】:
标签: c winapi serial-port