据说明天样片就寄来了,可是我的pc端串口还未做,以为很难,就拖着,看了
之后更是一头雾水今天下狠心,没想到不到两小时就解决了,做个教程方便大家。
使用serialport类,C#自带的
第一个例子参见首先是在一台pc同一个串口上实现数据收发。那么需要把TX和RX短接。
我等软件专业的哪有什么做跳线的母头、导线啊,我就在程序运行时拿钥匙把那两个脚短接了。
public partial class Form1 : Form { SerialPort serialPort1 = new SerialPort();创建一个对象serialPort1,然后剩下的代码参见
第二个例子,上位机与下位机的通信,以上链接里的例子我觉得没有什么意义。我决定自己写一个读
mini2440开发板串口的例子。就像DNW那样的。将第一个例子里接受按钮的事件处理改为
private void button2_Click(object sender, EventArgs e)
{ serialPort1.PortName = "COM1"; serialPort1.BaudRate = 115200; serialPort1.DataBits = 8; serialPort1.ReceivedBytesThreshold = 1; serialPort1.Open();}
因为我们想异步读取,总不能在 private void button2_Click(object sender, EventArgs e)里写个死循环
一直读吧。我就想弄个事件驱动,如果这个serialport也不是窗体控件,我只要选中它,在属性里很容易就找到相关事件,然后双击就可以添加事件处理方法了。可惜它不是。真找到了答案
ReceivedBytesThreshold 属性, 当缓冲区的数据字节数大于等于SeralPort类对象的ReceivedBytesThreshold值时DataReceived事件被触发先在frm1里添加一个方法,就是每当读入一个byte就执行的方法,将读入的byte转化为ascii码
void ps_DataReceived(object sender, SerialDataReceivedEventArgs e) { string sValue; byte[] bs; bs = System.BitConverter.GetBytes(serialPort1.ReadByte()); sValue = System.Text.Encoding.ASCII.GetString(bs); textBox2.Text += sValue; }然后就是注册这个事件serialPort1.DataReceived += new SerialDataReceivedEventHandler(ps_DataReceived);测试时说跨线程调用windows窗体控件,这个.net freamwork2还真是烦人,直接设
Control.CheckForIllegalCrossThreadCalls = false;即 public Form1()
{ InitializeComponent(); serialPort1.DataReceived += new SerialDataReceivedEventHandler(ps_DataReceived); Control.CheckForIllegalCrossThreadCalls = false; }好了,demo完成了
最后想当然的关闭串口,也不知道放的位置对否
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { serialPort1.Close(); }