我正在尝试将用于与串口通信的TCL代码转换为C#代码。但由于某种原因,我的命令没有得到回应。
这是TCL中的串行com init:
proc openUart {} {
set robot::fd_ [open COM${robot::port_num}: w+]
fconfigure $robot::fd_ -mode 9600,e,7,1
fconfigure $robot::fd_ -blocking 0
fconfigure $robot::fd_ -buffering none
fileevent $robot::fd_ readable ""
}
“命令”发送方式如下:
proc SendCmd {command} {
set commandlen [string length $command]
for {set i 0} {$i < $commandlen} {incr i} {
set letter [string index $command $i]
after 10
puts -nonewline $robot::fd_ $letter
}
after [expr 2 * 10]
puts -nonewline $robot::fd_ "\n"
flush $robot::fd_
}
这就是我将其翻译为C#的方式。打开港口:
private void Initialize(string com)
{
_comPort = new SerialPort(com,9600,Parity.Even,7,StopBits.One)
{
Encoding = Encoding.ASCII,
NewLine = "\n"
};
_comPort.Open();
}
发送命令:
private string SendCommand(Commands cmd)
{
string commandToWrite = Command(cmd);
for (int i = 0; i < CommandLen; i++)
{
Thread.Sleep(10);
_comPort.Write(commandToWrite.ToCharArray(), i, 1);
}
Thread.Sleep(10 * 2);
_comPort.Write("\n");
_comPort.BaseStream.Flush();
}
我使用串口转USB线将PC连接到机器人并同时运行TCL和C#程序 - TCL脚本打开机器人上的LED。 我的C#代码没有打开LED,这意味着机器人无法识别命令。
我正在使用相同的com端口,所以我认为问题就是其中之一:
我没有在C#中正确初始化com端口。你如何设置阻止和缓冲?
C#中是否存在编码问题?不是ASCII是TCL中的默认编码吗?
我是如何在两种语言之间逐个发送命令的时间差异?
答案 0 :(得分:0)
问题解决了!
我最后使用另一条串行电缆和2根蓝线将电缆环回到我的电脑中,穿过RX \ TX(感谢don_q的想法!)。 使用简单的串行监视器“UART终端”,我嗅探了命令,令我惊讶的是,TCL脚本在'\ n'之前添加了'\ r'!
事实上,机器人正在期待这种命令格式 -
:010508010000F1\r\n
我将C#中的NewLine属性更改为“\ r \ n”,现在我使用 -
完成命令_comPort.WriteLine("");
现在一切正常。