首页 / C# / 如何在C#中向串行设备发送字节?
如何在C#中向串行设备发送字节?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在C#中向串行设备发送字节?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3742字,纯文字阅读大概需要6分钟。
内容图文
![如何在C#中向串行设备发送字节?](/upload/InfoBanner/zyjiaocheng/814/4047bb0cfea94a17b4dcae7937da1a49.jpg)
我有一个使用串行(通过USB适配器)与我的PC连接的设备.我真的很难让它在C#中很好地发挥.我知道它工作正常,因为供应商提供的软件表现得如预期的那样.我也知道我能够使用我的代码接收数据,这要归功于一个重复发送“OK”的测试模式.
这是我的代码:
private SerialPort port;
public SerialConnection()
{
this.port = new SerialPort("COM3", 38400, Parity.None, 8, StopBits.One);
this.port.WriteTimeout = 2000; port.ReadTimeout = 2000;
this.port.Open();
this.port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
}
public void SendCommand(byte[] command)
{
this.port.Write(command,0,command.Length);
string chars = "";
foreach (byte charbyte in command) chars += (char)charbyte;
Console.WriteLine(" -> " + chars);
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = this.port.ReadLine();
Console.WriteLine(" <- " + data);
}
目前我正在使用另一种测试模式,该模式应该回显它收到的任何内容.因此,我用以下字节调用SendCommand:
byte[] {
0x50,
0x69,
0x6E,
0x67
}
但似乎没有任何东西被送回去.
我不知道下一步该尝试什么.有人有什么建议吗?
对于一个附属问题,我发布了一些PortMon日志.我认为它们在这里也可能有用,所以它们在这里:
> Vendors software – 过滤掉所有IOCTL_SERIAL_GET_COMMSTATUS条目
> My toe-dip attempt
解决方法:
每个RS-232设备都需要使用某种flow control机制来通知相对的部分正在进行的通信.有三种基本机制:
>基于硬件的RTS / CTS通过两条专用线路,通常用于控制单个数据块的发送
>通过两条专用线路实现基于硬件的DTR / DSR,通常用于控制整个通信会话
>通过一对专用字符的基于软件的XON / XOFF(请注意,在这种情况下,需要对数据进行编码以防止与控制字符冲突)
(开始升级)
旧版应用中的初始队列长度和超时:
1 IOCTL_SERIAL_SET_QUEUE_SIZE InSize: 1024 OutSize: 1024
2 IOCTL_SERIAL_SET_TIMEOUT RI:2000 RM:0 RC:2000 WM:0 WC:2000
而你没有设置它们.尝试使用SerialPort.WriteBufferSize和SerialPort.ReadBufferSize设置队列大小.同样使用SerialPort.ReadTimeout和SerialPort.WriteTimeout设置超时.
(最后更新)
在您的情况下,遗留应用程序会:
12 IOCTL_SERIAL_CLR_RTS
13 IOCTL_SERIAL_SET_DTR
你做的时候:
12 IOCTL_SERIAL_CLR_RTS
13 IOCTL_SERIAL_CLR_DTR
您没有设置DTR(数据终端就绪)信号,因此设备不希望串行线路上有任何数据或命令.因此将SerialPort.DtrEnable设置为true.
第二个问题是你不打开握手.遗留应用程序:
16 IOCTL_SERIAL_SET_HANDFLOW Shake:1 Replace:0 XonLimit:0 XoffLimit:0
18 IOCTL_SERIAL_SET_RTS
…
21 IOCTL_SERIAL_CLR_RTS
你做的时候:
16 IOCTL_SERIAL_SET_HANDFLOW Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
通过将SerialPort.Handshake设置为Handshake.RequestToSend将其打开.
此外,您似乎经常打开,关闭和重新配置串行端口.尝试设置端口,然后在整个会话中使用相同的SerialPort实例.不要尝试重新打开它,因为您将导致重新配置物理端口引脚的状态.
串行通信不是黑魔法,但它对设置非常敏感,各种设备需要特殊的设置和处理.适当的命令时序也可能是个问题.
如果您的设备确实有一些技术文档,请先阅读两次,并在第一时间遵守它.至少应妥善记录握手模式,命令等.
如果您没有任何文档,请尝试逐个缓解差异.
更新:发送和接收数据.
您写道,您发送了命令’Ping'(从十六进制解码为ASCII).但是,您没有提到发送和命令终止序列.通常,串行设备期望行结束序列(通常是CR LF)作为命令的终止.在设备收到包含行结束的完整命令之前,它无法回复.
您正在通过调用ReadLine来处理数据接收事件 – 但是,在您不能指望完整数据行的位置(即包括行结束以便能够检测到清单行).您应该检查提供的事件参数并逐字节读取输入.
创建一个包装类是个好主意,它将提供定制的发送命令,接收响应,发送数据,接收数据功能.包装器必须在内部与代码的其余部分异步工作.这样,您将拥有可用的自定义API和良好的串行端口处理.
请注意,SerialPort.NewLine属性用于指定行尾序列的外观. (在你提到的另一个问题中,你试图将它设置为特殊字符集.这确实是错误的.)
曾经有一段时间我是一个串行通讯英雄(那些是我们没有vmware的日子,但有两台486供电的PC和一对直接连接的调制解调器来开发和调试通信应用程序:-)),但我希望这至少有帮助一点点.
最后但并非最不重要的一些常用术语:
> DTE – 数据终端设备=您的计算器
> DCE – 数据通信设备=您的设备,例如调制解调器
内容总结
以上是互联网集市为您收集整理的如何在C#中向串行设备发送字节?全部内容,希望文章能够帮你解决如何在C#中向串行设备发送字节?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。