在C#和C#之间进行串行通信时遇到问题
我有一台运行C代码的微处理器和一台运行C代码的计算机。我试图让他们通过串行连接(System.IO.Ports.SerialPort)进行通信。我在沟通方面没有问题,而是在沟通方面有问题 在C#中,我有这样的代码来发送字符串“rr\n”: 在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亮起。这使我们能够观察微控制器是否按预期接收到
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);