在C#中实现串口相比VC下容易很多,只要在工具栏中拖一个串口控件,设置好串口号即可开始工作。
如果是在后台运行串口通讯,那么简单的设置已经足够了。
当然,我们如果想让这个串口有比较友好的界面设置那么,我们在实现的时候,往往需要把界面上增加一些串口属性参数的设置框。
一、串口号选择框的实现(最简单的办法枚举有所串口号)
我在网上见到过很多利用注册表或者System.Management来获取本机所有可用串口号的代码,给我的感觉都有舍近求远的嫌疑。这里我们用朴实的方法,一句话搞定:
string[] sps = SerialPort.GetPortNames();
comboBox1.Items.AddRange(sps);
这个方法必须保证引入System.IO.Ports;
我们平时不怎么用串口的人可能对这个方法不太熟悉,这里提供官方的链接,一看就懂;
SerialPort官方链接
二、波特率及停止位的选择框的实现
我仔细的找了官方的文档,没有发现可以直接枚举出来的属性和方法,那么这里只能自己建立枚举,这里写出来,大家拷贝后即可使用,代码如下:
///
/// 串口数据位列表(5,6,7,8)
///
public enum SerialPortDatabits : int
{
FiveBits = 5,
SixBits = 6,
SeventBits = 7,
EightBits = 8
}
///
/// 串口波特率列表。
/// 75,110,150,300,600,1200,2400,4800,9600,14400,19200,28800,38400,56000,57600,
/// 115200,128000,230400,256000
///
public enum SerialPortBaudRates : int
{
BaudRate_75 = 75,
BaudRate_110 = 110,
BaudRate_150 = 150,
BaudRate_300 = 300,
BaudRate_600 = 600,
BaudRate_1200 = 1200,
BaudRate_2400 = 2400,
BaudRate_4800 = 4800,
BaudRate_9600 = 9600,
BaudRate_14400 = 14400,
BaudRate_19200 = 19200,
BaudRate_28800 = 28800,
BaudRate_38400 = 38400,
BaudRate_56000 = 56000,
BaudRate_57600 = 57600,
BaudRate_115200 = 115200,
BaudRate_128000 = 128000,
BaudRate_230400 = 230400,
BaudRate_256000 = 256000
}
其余的属性,相对简单也不常用,这里不再赘述。
public Form1()
{
InitializeComponent();
//获取串口号
string[] sps = SerialPort.GetPortNames();
comboBox1.Items.AddRange(sps);
comboBox1.SelectedIndex=comboBox1.Items.Count-1;
serialPort1.PortName = comboBox1.Text;
//获取波特率
SerialAttributeInfo.SetBauRateValues(comboBox2);
//注意,在用indexof时要将数字转为字符串,否则找不到
comboBox2.SelectedIndex = comboBox2.Items.IndexOf(serialPort1.BaudRate.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text.Contains("O") && !serialPort1.IsOpen)
{
serialPort1.Open();
textBox1.Text = serialPort1.ReadChar().ToString();
button1.Text = "关闭串口[&C]";
}
else
{
serialPort1.Close();
button1.Text = "打开串口[&O]";
}
}
简单设置好后,我们就可以进行串口通讯了
运行效果如下图:
打开串口后可以收到串口的数据
这里的程序很简单,如果要比较好的实现时事通讯,那么最好用ReadBufferSize结合线程来控制读写。如果只需要简单的通讯,也可以结合计时器来实现。这里不再深入讨论。