據說明天樣片就寄來了,可是我的pc端串口還未做,以為很難,就拖著,看了http://www.cnblogs.com/tuyile006/archive/2008/10/06/514300.html
之後更是一頭霧水
今天下狠心,沒想到不到兩小時就解決了,做個教程方便大家。
使用serialport類,C#內建的
第一個例子參見http://book.csdn.net/bookfiles/499/10049917236.shtml
首先是在一台pc同一個串口上實現資料收發。那麼需要把TX和RX短接。
我等軟體專業的哪有什麼做跳線的母頭、導線啊,我就在程式運行時拿鑰匙把那兩個腳短接了。
public partial class Form1 : Form
{
SerialPort serialPort1 = new SerialPort();
建立一個對象serialPort1,然後剩下的代碼參見 http://book.csdn.net/bookfiles/499/10049917236.shtml
第二個例子,上位機與下位機的通訊,以上連結裡的例子我覺得沒有什麼意義。我決定自己寫一個讀
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();
}