【问题标题】:Cannot convert TCL serial com to C#无法将 TCL 串行 com 转换为 C#
【发布时间】: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 端口,所以我认为问题是其中之一:

  1. 我没有在 C# 中正确初始化 com 端口。如何设置阻塞和缓冲?

  2. C# 中是否存在编码问题? ASCII 不是 TCL 的默认编码吗?

  3. 在两种语言之间逐字母发送命令的方式是否存在时间差异?

【问题讨论】:

  • sysinternals portmon 是查看网络上传输内容的好方法
  • 阻塞可能是超时。尝试设置WriteTimeout 并调用DiscardOutBuffer()。其他注意事项:1)Flush(),为什么? 2) "\n"c#tcl 中是否相同? 3) 我不认为10ms 的延迟很重要,您可以简单地尝试将事情作为一个整体发送:_comPort.Write(commandToWrite + "\n"); 4) 你确定,Command(cmd) 会产生正确的结果,没有要检查的代码。
  • 如果你不设置握手属性(你应该)那么你必须自己打开握手信号。将 DtrEnable 和 RtsEnable 属性设置为 true
  • 删除 10ms 延迟会导致 TCL 脚本无法工作。机器人似乎对此很敏感,不知道为什么。将延迟增加到 100 毫秒并没有改变。
  • 我也尝试过运行portmon,但它无法在我的Win7 64b机器上运行

标签: c# serial-port tcl


【解决方案1】:

问题已解决!

我终于使用另一条串行电缆和 2 根蓝色线将电缆环回我的 PC,穿过 RX\TX(感谢 don_q 的想法!)。 使用简单的串行监视器“UART 终端”,我嗅探了命令,令我惊讶的是,TCL 脚本在 '\n' 之前添加了一个 '\r'!

所以实际上机器人期待这种命令格式 -

:010508010000F1\r\n

我将 C# 中的 NewLine 属性更改为“\r\n”,现在我使用 - 完成一个命令

_comPort.WriteLine("");

现在一切正常。

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多