HI 我是c#串口的新手。我正在写一个运行的c#程序是winXP和win7,以便在机器发送数据时保持从串口收到的数据。
using System.IO;
using System.IO.Ports;
using System.Threading;
namespace RS232RVR
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SettingRS232();
}
public void SettingRS232 ()
{
try
{
SerialPort mySerialPort = new SerialPort("COM6");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None; //send to hardware flow control.
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);
mySerialPort.Open();
richTextBox1.Text = "on";
mySerialPort.Close();
}
catch (Exception ex)
{
richTextBox1.Text = ex.Message;
}
}
private void DataReceviedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
richTextBox1.Text = indata;
}
}
}
COM6在我的电脑上有效。但是我的问题似乎是当数据来自串口时,datareceived事件不会触发。 (我通过使用一些免费软件应用程序检查了这项运动)
任何人都可以提供帮助吗?
感谢
答案 0 :(得分:5)
mySerialPort.Open();
richTextBox1.Text = "on";
mySerialPort.Close();
这不会起作用,打开它后,你会在几个微秒后关闭串口。是的,DataReceived事件处理程序不可能触发。关闭程序时只关闭端口。
mySerialPort.Handshake = Handshake.None
这也是一个问题,你现在需要自己控制握手信号。绝大多数串口设备在看到机器已通电并准备接收之前不会发送任何内容。将DtrEnabled和RtsEnabled属性设置为true。
答案 1 :(得分:1)
您是否从应用程序中复制了该代码?它可能只是一个事件处理程序名称拼写错误的情况?例如。 DataReceviedHandler实际上应拼写为DataReceivedHandler。
答案 2 :(得分:1)
问题解决了,我想分享一下。我的罚款如下:
namespace RS232RVR
{
public partial class Form1 : Form
{
private delegate void SetTextDeleg(string data);
public Form1()
{
InitializeComponent();
SettingRS232();
}
public void SettingRS232 ()
{
try
{
SerialPort mySerialPort = new SerialPort("COM6");
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 += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.DataReceived += DataReceivedHandler;
textBox1.Text = "Serial Port is Ready.";
}
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 });
//textBox1.Text += indata;
}
private void DisplayToUI(string displayData)
{
textBox1.Text += displayData.Trim();
// textBox1.Text += displayData;
}
}
}
如果有人对代码发表评论,欢迎您,我很高兴并希望更好地编写代码。