我有一个可以通过 RS232 进行通信的设备。它带有访问数据的通信协议(protocol)。
我正在编写一个简单的 C# 程序来连接并获取设备的状态,但我不太确定我是否走在正确的路径上。
下面是他们给出的示例。
命令 50:状态请求
状态请求命令用于请求注册响应包,后续操作不会改变系统的状态。
0 1 2 3 4 5 6 7 8 9 10 11 12 13
STX 地址 地址 CMOD "5""0""0""3"TKN1 TKN0 类型 CHKL CHKH 0X0D
STX = 帧的起始字节 (0x02)
ADDR = TE550逻辑地址[2字节]
CMOD = CMOD 引用 [1 字节]
TKN1/0 = 帧标识字节 [2 字节]
TYPE = 可定制框的选择字节 (RiqA/B)* [1 字节]
CHKH/L = 校验和 [2 字节]
END = 帧的结束字节 (0x0D)
示例: PC到TE550的状态请求(地址01),CMOD 1, token 01,类型1
[0x02]0115003011EE[0x0D]
我可以使用串行端口连接到 com 端口。
我指的是DesMy的回答“RS232 serial port communication c# win7 .net framework 3.5 sp1”
到目前为止,一旦写入 COM 端口,我就没有收到任何信号。但是我不太确定我是否将正确的数据发送到 com 端口。目前我发送的数据如下
comPort.Write("20115003011EE3");
任何帮助/示例代码等将不胜感激。
公共(public)无效ConnectRS232()
{
try
{
SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.ReadTimeout = 2000;
mySerialPort.WriteTimeout = 500;
mySerialPort.DtrEnable = true;
mySerialPort.RtsEnable = true;
mySerialPort.Open();
mySerialPort.DataReceived += DataReceivedHandler;
mySerialPort.Write("20115003011EE3");
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
}
}
public void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
System.Threading.Thread.Sleep(500);
string indata = sp.ReadExisting();
this.BeginInvoke(new SetTextDeleg(DisplayToUI), new object[] { indata });
}
private void DisplayToUI(string displayData)
{
textBox1.Text += displayData.Trim();
}
最佳答案
处理低级端口 I/O 时,字符不是字节!
不发送字符串。创建包含正确字符的字节流并将其发送。
[在 .NET 中,字符是短字符,而不是字节。没关系。使用字节。]
关于c# - 使用C#通过RS232发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235071/