C#SerailPort串口通信Demo

    技术2022-05-20  32

    我是用两个USB转串口的设备在单机PC上测试的,其中有一段很好的解决了串口返回数据不完整的问题,测试中是很稳定的,不管数据长短。在这里记录下。SerailPort设置很简单,只默认了个波特率。

     

    private void Form1_Load(object sender, EventArgs e) { fillComBox(comboBox1); } /// <summary> /// 填充下拉列表 /// </summary> /// <param name="obj">要填充的下拉列表</param> private void fillComBox(object obj) { ComboBox cmb = obj as ComboBox; string[] ports = SerialPort.GetPortNames(); foreach (string item in ports) { cmb.Items.Add(item); } } private SerialPort clientSP;//接受串口 private int baudRate = 9600;//波特率 /// <summary> /// 创建一个串口资源 /// </summary> /// <param name="_portName">端口名称</param> /// <param name="_baudRate">波特率</param> private SerialPort createSerialPort(string _portName, int _baudRate) { SerialPort tempSP = new SerialPort(); tempSP.BaudRate = _baudRate; tempSP.PortName = _portName; return tempSP; } /// <summary> /// 打开SerialPort串口资源 /// </summary> /// <param name="obj">要打开的串口资源</param> private void Open(object obj) { try { SerialPort sp = obj as SerialPort; if (sp != null && !sp.IsOpen) { sp.Open(); sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);//委托事件 appendMess("执行:打开成功"); } } catch (Exception exx) { MessageBox.Show(exx.Message + "/r/n" + exx.StackTrace); } } void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = sender as SerialPort; int recvLength = 0; object useLock = new object();//线程锁 bool loop = true; //这么做是为了避免接收数据不完整的情况 lock (useLock) { while (loop) { if (sp.BytesToRead == recvLength)//如果缓冲区的字节数等于现在接收的数据长度 { loop = false; } else { recvLength = sp.BytesToRead; } Thread.Sleep(100); } byte[] recvArray = new byte[recvLength];//存储缓存数据的数组 sp.Read(recvArray, 0, recvArray.Length);//从SerailPort填充 appendMess("接收:" + Encoding.ASCII.GetString(recvArray)); //这就用ASCII做了个例子,16的话用遍历Byte[],其中 += Byte.ToString("x"); } } /// <summary> /// 显示数据 /// </summary> /// <param name="obj"></param> private void appendMess(object obj) { string info = obj.ToString(); this.BeginInvoke((EventHandler)delegate { richTextBox1.AppendText(info + "/r/n"); }); } /// <summary> /// 发送数据 /// </summary> /// <param name="obj">SearialPort数据资源</param> /// <param name="obj">要发送的数据</param> private void Send(object objSP, object objStr) { SerialPort sp = objSP as SerialPort; string sendStr = objStr.ToString(); if (sp != null && sp.IsOpen) { sp.Write(sendStr); Thread.Sleep(500); } appendMess("发送:" + sendStr); } /// <summary> /// 打开端口按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_openPort_Click(object sender, EventArgs e) { clientSP = createSerialPort(comboBox1.SelectedItem.ToString(), baudRate); Open(clientSP); } /// <summary> /// 发送按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { Send(clientSP, textBox1.Text); }

     

     

     

    winXP, vs2008。很简陋啊,呵呵,备忘的吧。用的时候别网了些Close();


    最新回复(0)