我有一个可以通过RS232进行通信的设备。它附带了访问数据的通信协议。
我正在编写一个简单的c#程序来连接并从设备获取状态,我不太确定我是否在正确的道路上。
以下是他们提供的样本。
命令50:状态请求
status request命令用于请求注册响应包,而不会在以后执行可能会改变系统状态的操作。
0 1 2 3 4 5 6 7 8 9 10 11 12 13
STX ADDR ADDR CMOD" 5" " 0" " 0" " 3" TKN1 TKN0 TYPE 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,令牌01,类型1的状态请求
[0×02] 0115003011EE [0X0D]
我可以使用串口连接到com端口。
我指的是DesMy的回答" RS232 serial port communication c# win7 .net framework 3.5 sp1"
到目前为止,一旦写入COM端口,我没有收到任何信号。但是,我不确定是否将正确的数据发送到com端口。目前我发送的数据如下
comPort.Write(" 20115003011EE3&#34);
非常感谢任何帮助/示例代码等。
public void 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();
}
答案 0 :(得分:2)
处理低级别端口I / O时,字符不是字节!
不要发送字符串。创建一个包含正确字符的字节流并发送。
[.NET字符是短裤,而不是字节。没关系。使用字节。]