【发布时间】:2014-10-06 14:32:56
【问题描述】:
我正在尝试将用于与串行端口通信的 TCL 代码转换为 C#。但由于某种原因,我的命令没有得到响应。
这是TCL中的串口初始化:
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 的默认编码吗?
在两种语言之间逐字母发送命令的方式是否存在时间差异?
【问题讨论】:
-
sysinternals portmon 是查看网络上传输内容的好方法
-
如果你不设置握手属性(你应该)那么你必须自己打开握手信号。将 DtrEnable 和 RtsEnable 属性设置为 true。
-
删除 10ms 延迟会导致 TCL 脚本无法工作。机器人似乎对此很敏感,不知道为什么。将延迟增加到 100 毫秒并没有改变。
-
我也尝试过运行portmon,但它无法在我的Win7 64b机器上运行
标签: c# serial-port tcl