无法将TCL串口转换为C#

时间:2014-10-06 14:32:57

标签: c# serial-port tcl

我正在尝试将用于与串口通信的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端口,所以我认为问题就是其中之一:

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

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

  3. 我是如何在两种语言之间逐个发送命令的时间差异?

1 个答案:

答案 0 :(得分:0)

问题解决了!

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

事实上,机器人正在期待这种命令格式 -

:010508010000F1\r\n

我将C#中的NewLine属性更改为“\ r \ n”,现在我使用 -

完成命令
_comPort.WriteLine("");

现在一切正常。