前提
C#要实现串口通信一定要创建一个Form
源码及说明
这是一个连接COM3串口,通过键盘摁键发出信息的基础程序(摁键对应小键盘的1,2,3)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text.RegularExpressions;
namespace 上位机串口程序
{
public partial class Form1 : Form
{
SerialPort sp1 = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false; //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性)
sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);//接收到数据时的委托事件
//sp1.ReceivedBytesThreshold = 1;
//准备就绪
sp1.DtrEnable = true;
sp1.RtsEnable = true;
//设置数据读取超时为1秒
sp1.ReadTimeout = 1000;
sp1.Close();
if (!sp1.IsOpen)
{
sp1.PortName = "COM3";
sp1.BaudRate = 4800; //波特率
sp1.DataBits = 8; //数据位
sp1.StopBits = StopBits.One;
sp1.Parity = Parity.None;
if (sp1.IsOpen == true)//如果打开状态,则先关闭一下
{
sp1.Close();
}
sp1.Open(); //打开串口
judge.Text = "串口连接成功";
}
}
//委托方法
void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] byteRead = new byte[sp1.BytesToRead]; //BytesToRead:sp1接收的字符个数
Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组
sp1.Read(receivedData, 0, receivedData.Length); //读取数据
sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer
string strRcv = null;
for (int i = 0; i < receivedData.Length; i++) //窗体显示
{
strRcv += receivedData[i].ToString("X2"); //16进制显示
}
receive.Text += strRcv + "\r\n";
}
void text_send(string send_str)
{
String strSend = send_str;
string sendBuf = strSend;
string sendnoNull = sendBuf.Trim();
string sendNOComma = sendnoNull.Replace(',', ' ');
string sendNOComma1 = sendNOComma.Replace(',', ' ');
string strSendNoComma2 = sendNOComma1.Replace("0x", "");
strSendNoComma2.Replace("0X", "");
string[] strArray = strSendNoComma2.Split(' ');
int byteBufferLength = strArray.Length;
for (int i = 0; i < strArray.Length; i++)
{
if (strArray[i] == "")
{
byteBufferLength--;
}
}
byte[] byteBuffer = new byte[byteBufferLength];
int ii = 0;
for (int i = 0; i < strArray.Length; i++)
{
Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
int decNum = 0;
if (strArray[i] == "")
{
continue;
}
else
{
decNum = Convert.ToInt32(strArray[i], 16);
}
byteBuffer[ii] = Convert.ToByte(decNum);
ii++;
}
sp1.Write(byteBuffer, 0, byteBuffer.Length);
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
switch(e.KeyValue)
{
case 97: text_send("01"); break;
case 98: text_send("02"); break;
case 99: text_send("03"); break;
default:text_send("04");break;
}
}
}
}