Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#和C#之间进行串行通信时遇到问题_C#_C_Serial Port - Fatal编程技术网

在C#和C#之间进行串行通信时遇到问题

在C#和C#之间进行串行通信时遇到问题,c#,c,serial-port,C#,C,Serial Port,我有一台运行C代码的微处理器和一台运行C代码的计算机。我试图让他们通过串行连接(System.IO.Ports.SerialPort)进行通信。我在沟通方面没有问题,而是在沟通方面有问题 在C#中,我有这样的代码来发送字符串“rr\n”: 在C中(在微控制器上),我有这样的代码来接收字符串: gets(str); 请注意,STDIN流是serialport流。这就是事情变得有趣的地方。作为测试,我们有一些代码,如果str等于“rr”,则会导致LED亮起。这使我们能够观察微控制器是否按预期接收到

我有一台运行C代码的微处理器和一台运行C代码的计算机。我试图让他们通过串行连接(System.IO.Ports.SerialPort)进行通信。我在沟通方面没有问题,而是在沟通方面有问题

在C#中,我有这样的代码来发送字符串“rr\n”:

在C中(在微控制器上),我有这样的代码来接收字符串:

gets(str);
请注意,STDIN流是serialport流。这就是事情变得有趣的地方。作为测试,我们有一些代码,如果
str
等于“rr”,则会导致LED亮起。这使我们能够观察微控制器是否按预期接收到它

使用超级终端时,我可以键入“r”,然后键入“r”,然后按enter->,LED亮起,表示它确实从串行流中读取了“rr”。然而,当我使用C#中的上述
WriteLine
函数时,我们没有得到这样的结果

我相信这可以归结为超级终端逐字符发送的功能,并且
get()
函数逐字符读取,直到遇到换行符


有谁能解释一下如何让C的
WriteLine()
和C的
get()
函数协同工作吗?

超级终端可能(可能)使用了与C不同的换行符。尝试写入“rr\r”或“rr\n”而不是使用
WriteLine

经典错误是忘记打开握手信号,方法是启用硬件握手或将SerialPort.DtrEnable和RtsEnable属性设置为true。串行端口设备应忽略任何内容,直到检测到另一端通电并准备接收

不太可能的是微控制器对接收到的字节响应不够快。要么是因为它对中断的响应很慢,要么是在使用轮询。这可能会导致接收器溢出错误,并丢失接收到的字节。降低波特率可以解决这一问题。

C#可能会为每个
r
发送2个字节(如UTF16),而超级终端可能只为每个
r
发送1个字节(如ASCII)


可能需要查看有关它们是如何编码的信息

您是否考虑过使用示波器或逻辑分析仪来帮助确定问题?如果您使用嵌入式系统,这些工具是必不可少的。与HT相比,使用这些工具可以告诉您WriteLine方法正在做什么或没有做什么。

这可能是一个缓冲问题,但也可能与微处理器作为线端终止符的预期有关。HT是只发送换行还是在换行后发送回车

首先,确定微处理器对生产线末端的期望值。然后使用Write而不是WriteLine,并以ASCII格式写入各个字节。请记住.NET喜欢使用UNICODE,但微处理器可能需要ASCII

可能您发送了Unicode字节,也可能您发送了一个非预期的回车字符,并连接到RR


注意,这个类有一个名为NewLine的属性。通过正确设置WriteLine,您可以使其正常工作。还有另一个属性叫做编码。是否已将其设置为ASCII?

能否让微控制器将接收到的内容写回?查看准确的输出可能会给您一些提示,说明问题所在。首先要检查的是端口设置(波特率、流量控制等)。使用以下命令捕获HT会话:;然后用你的程序捕获一个会话并进行比较。+1@Stephen Cleary提到PortMonPortMon不会监视这个特定的端口,因为它“正在使用”。我很想写回Micro接收到的内容,但我们接收它的方式是使用gets()函数,该函数不起作用。@Adam:在程序(或HT)运行之前启动PortMon监视。我检查了换行符,它们都使用相同的字符。有趣的是,get()函数没有终止,这意味着即使我正在发送它,它也没有遇到“\n”字符。或者在不应该遇到的情况下打开握手。虽然我感谢您的输入,但我们也检查了所有这些内容。嗯,如果您检查控制器的响应是否足够快以中断,那么您应该已经知道为什么它不工作。我一直在设计PC到MCU的RS-232接口,而且我还没有遇到过比PC在响应RS-232命令时更慢的MCU。即使是一个具有可怕的无效架构的8位MCU,比如运行在1MHz左右的8051,也会在你“慢”的intel-multi-core-i7-fluff PC周围欢笑和绕圈运行。这仅仅是因为MCU没有随Windows提供。@Lundin-你还没有遇到程序员。字符串在内存中编码为UTF-16,但是它们被
SerialPort
类适当地重新编码。好吧,没有什么可以说它编码了。+1对于一些简单和逻辑的想法,比如你的缓冲问题想法。
gets(str);