我正在尝试将一串AT命令发送到USB加密狗。我已成功写入串口。但我还没有成功回读。基本上我想做的是发送让我们说AT到加密狗并在richtextbox中接收OK。接下来将从另一台设备发送信息到加密狗并在richtextbox中读取它。
以下是我正在使用的代码:
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
SerialPort sp = null; //<---- serial port at form level
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// initialise port in form loadmyport.PortName = "COM3";
sp = new SerialPort();
sp.PortName = "COM8";
sp.BaudRate = 115200;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.NewLine = System.Environment.NewLine;
sp.ReadTimeout = 2000;
sp.WriteTimeout = 2000;
sp.DtrEnable = false;
sp.RtsEnable = false;
sp.WriteBufferSize = 4096;
sp.ReadBufferSize = 4096;
sp.Handshake = Handshake.None;
sp.Encoding = System.Text.Encoding.ASCII;
// also set up baud rate etc here.
// attach event handler to capture data received
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
private void button1_Click(object sender, EventArgs e)
{
connect.Enabled = false;
try
{
// open port if not already open
// Note: exception occurs if Open when already open.
if (!sp.IsOpen)
{
sp.Open();
}
// send data to port
sp.Write("ATXXX,XXXXXXX\r\n");
disconnect.Enabled = true;
}
catch (Exception)
{
// report exception to user
Console.WriteLine(e.ToString());
}
}
private void button2_Click(object sender, EventArgs e)
{
connect.Enabled = true;
try
{
// open port if not already open
// Note: exception occurs if Open when already open.
if (!sp.IsOpen)
{
sp.Open();
}
// send data to port
sp.Write("atXX,0\r\n");
}
catch (Exception)
{
Console.WriteLine(e.ToString());
}
finally
{
disconnect.Enabled = false;
}
}
public void OnApplicationExit(object sender, EventArgs e)
{
sp.Close();
}
}
}
答案 0 :(得分:3)
不要直接在主代码中从串口读取数据。您有一个用于数据接收事件的事件处理程序,它当前将响应写入调试控制台。您需要做的就是更改事件处理程序,将文本写入富文本框。 (您在文本框中读取数据并显示它的代码将永远不会显示任何内容,因为(a)port_DataRecieved看起来似乎永远不会订阅任何事件,因此它不会被调用,并且(b)您的sp_DataReceived事件处理程序正在读取数据并将其记录到调试输出,因此任何其他尝试读取端口的代码都会发现它“空”。
请注意,sp_DataReceived事件将在另一个线程而不是您的UI线程上引发,因此您需要Invoke或BeginInvoke将控制权传递回UI线程以将文本添加到文本框中。
另请注意,您可能无法将响应作为单个“数据包”获取。它可能会分成几个部分,因此您需要将每个传入的消息添加到文本框中文本的末尾,以便将您收到的所有部分的整个响应拼接在一起。