C# 无法将TCL串行com转换为C

C# 无法将TCL串行com转换为C,c#,serial-port,tcl,C#,Serial Port,Tcl,我正在尝试将TCL代码(用于与机器人的串行端口通信)转换为C。但由于某些原因,我的命令没有得到响应 这是TCL中的串行com初始化: 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_ -b

我正在尝试将TCL代码(用于与机器人的串行端口通信)转换为C。但由于某些原因,我的命令没有得到响应

这是TCL中的串行com初始化:

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_
}
并发出命令:

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电缆将我的电脑连接到机器人,并运行TCL和C程序- TCL脚本打开机器人上的LED。 我的C代码没有打开LED,这意味着机器人无法识别该命令

我使用的是相同的com端口,因此我认为问题在于:

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

C语言中可能存在编码问题吗?ASCII不是TCL中的默认编码吗

在两种语言之间,我发送命令信的方式是否会有时间上的差异

问题解决了

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

所以事实上,机器人期望这种命令格式-

:010508010000F1\r\n
我将C中的换行符属性更改为\r\n,现在我使用-

_comPort.WriteLine("");

现在一切都正常了。

sysinternals portmon是一个很好的方法,可以查看线路上的情况,阻塞可能是超时。尝试设置WriteTimeout并调用DiscardeBuffer。其他需要注意的事项:1同花顺,为什么?2\n和中是否相同?3我认为10毫秒的延迟并不重要,您可以尝试整体发送:\u comPort.WritecommandToWrite+\n;4如果您确定Commandcmd生成的结果正确,则没有代码可供检查。如果您没有设置握手属性,则必须自己打开握手信号。将DtrEnable和RtsEnable属性设置为true。删除10ms延迟会导致TCL脚本无法工作。机器人似乎对此很敏感,不知道为什么。不过,将延迟增加到100ms并没有改变。我也尝试运行portmon,但它无法在我的Win7 64b机器上运行
_comPort.WriteLine("");