W
wino
Unregistered / Unconfirmed
GUEST, unregistred user!
最近遇到这样一个问题:PC与单片机通过RS232进行通信,通信过程中,需要来回切换串口的校验位,其它参数不变,现在PC发一条带参数的命令时,第一个字节的校验位为1,后面紧跟着发3字节的数据,它们的校验位为0(注:这里的校验位为0和为1时,都为无校验状态,仅让接收端单片机识别哪些是命令,哪些是数据),如:95 01 01 01 03, 其中 95为命令,发送时校验位=1,后面四字节的校验位=0
代码如下:
Dcb.Parity := 1;
SetCommState(hNewCommFile, Dcb);
if Connected then //判断串口是否打开
begin
if not WriteToComm(HexStrToStr('95')) then
ShowMessage('Write 95 Error!');
Dcb.Parity := 0;
SetCommState(hNewCommFile, Dcb);
if not WriteToComm(HexStrToStr('01 01 01 03')) then
ShowMessage('Write 95 Data Error!');
end;
问题出来了,这样发送出去的 命令字节'95' 和 数据字节'01 01 01 03',单片机接收无响应,后查出原来是由于超时引起的,也就是说在做 Dcb.Parity = 0/1 SetCommState(hNewCommFile, Dcb)时,超过了单片机接收的时间间隔(10ms),所以数据字节部分没有当成参数来处理。
现在我想通过直接IO操作的方式替代SetCommState来控制串口相关寄存器(IO读写的权限的问题已解决),在网上看了一些资料,通过ComBase + 3 来读写LCR寄存器,可是不管怎么设置,串口的校验位和波特率都不会改变,望哪位有这方面的经验的兄弟出手相助,另开贴送分,谢谢!
代码如下:
Dcb.Parity := 1;
SetCommState(hNewCommFile, Dcb);
if Connected then //判断串口是否打开
begin
if not WriteToComm(HexStrToStr('95')) then
ShowMessage('Write 95 Error!');
Dcb.Parity := 0;
SetCommState(hNewCommFile, Dcb);
if not WriteToComm(HexStrToStr('01 01 01 03')) then
ShowMessage('Write 95 Data Error!');
end;
问题出来了,这样发送出去的 命令字节'95' 和 数据字节'01 01 01 03',单片机接收无响应,后查出原来是由于超时引起的,也就是说在做 Dcb.Parity = 0/1 SetCommState(hNewCommFile, Dcb)时,超过了单片机接收的时间间隔(10ms),所以数据字节部分没有当成参数来处理。
现在我想通过直接IO操作的方式替代SetCommState来控制串口相关寄存器(IO读写的权限的问题已解决),在网上看了一些资料,通过ComBase + 3 来读写LCR寄存器,可是不管怎么设置,串口的校验位和波特率都不会改变,望哪位有这方面的经验的兄弟出手相助,另开贴送分,谢谢!