串口通信
c# 串口通信主要操作:
- 命名空间:using system.io.ports;
- 获取端口:string[] ports = system.io.ports.serialport.getportnames();
- 设置端口名:serialport1.portname = “com1”; // 字符串
- 设置波特率:serialport1.baudrate = 115200;// int.parse(“115200”);
- 设置数据位:serialport1.databits = 1; // int.parse(“1”);
- 设置停止位:serialport1.stopbits = stopbits.one;
- stopbits.one:停止位1
- stopbits.onepointfive:停止位1.5
- stopbits.two:停止位2
- 设置校验位:serialport1.parity = parity.none;
- parity.none:无
- parity.even:奇校验
- parity.odd:偶校验
- 打开串口:serialport1.open();
- 关闭串口:serialport1.close();
- 可读字节:serialport1.bytestoread;
- 读取数据:serialport1.read(buffer, 0, len);
- 写入数据:serialport1.write(buffer);
- 接收事件: xxx_datareceived(object sender, system.io.ports.serialdatareceivedeventargs e);
示例代码
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;
using system.io.ports;
namespace serial_tools
{
public partial class form1 : form
{
string serialportname;
public form1()
{
initializecomponent();
}
private void form1_load(object sender, eventargs e)
{
string[] ports = system.io.ports.serialport.getportnames(); // 获取本机可用串口端口
comboboxport.items.addrange(ports);
comboboxport.selectedindex = comboboxport.items.count > 0 ? 0 : -1; // 有可用端口显示第一个
comboboxbaudrate.text = "115200"; // 默认波特率
comboboxdatabits.text = "8"; // 默认数据位:8
comboboxstopbit.text = "1"; // 默认停止位:1
comboboxcheck.text = "无"; // 默认无校验
}
/// <summary>
/// 重写 系统消息函数
/// </summary>
/// <param name="m"></param>
protected override void wndproc(ref message m)
{
base.wndproc(ref m);
}
/// <summary>
/// 串口数据接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialport1_datareceived(object sender, system.io.ports.serialdatareceivedeventargs e)
{
int len = serialport1.bytestoread; // 获取可读字节数
byte[] buff = new byte[len]; // 创建缓存数据数组
serialport1.read(buff, 0, len); // 把数据读取到buff数组
string str = encoding.default.getstring(buff); // byte值转ascii字符串
invoke((new action(() => {
if (checkboxhexshow.checked)
{
textboxrecv.appendtext(bytetohexstr(buff));
}
else
{
textboxrecv.appendtext(str);
}
}))); // 对话框追加显示数据
}
public static string bytetohexstr(byte[] bytes)
{
string hexstr = "";
try
{
if (bytes != null) {
for (int i = 0; i < bytes.length; i++)
{
hexstr += bytes[i].tostring("x2");
hexstr += " "; // 两个hex数值以空格隔开
}
}
return hexstr;
}
catch (exception)
{
return hexstr;
}
}
/// <summary>
/// 打开关闭串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonportonoff_click(object sender, eventargs e)
{
if (buttonportonoff.text == "打开串口") {
try
{
serialport1.portname = comboboxport.text; // 获取选择的串口端口
serialportname = comboboxport.text;
serialport1.baudrate = int.parse(comboboxbaudrate.text); // 获取选择的波特率
serialport1.databits = int.parse(comboboxdatabits.text); // 获取选择的数据位
// 设置停止位
if (comboboxstopbit.text == "1") { serialport1.stopbits = stopbits.one; }
else if (comboboxstopbit.text == "1.5") { serialport1.stopbits = stopbits.onepointfive; }
else if (comboboxstopbit.text == "2") { serialport1.stopbits = stopbits.two; }
// 设置奇偶校验
if (comboboxcheck.text == "无") { serialport1.parity = parity.none; }
else if (comboboxcheck.text == "奇校验") { serialport1.parity = parity.even; }
else if (comboboxcheck.text == "偶校验") { serialport1.parity = parity.odd; }
// 打开串口
serialport1.open();
buttonportonoff.text = "关闭串口";
}
catch (exception ex)
{
messagebox.show("串口打开失败"+ ex.tostring(), "警告",
messageboxbuttons.ok, messageboxicon.error);
}
}
else
{
try
{
serialport1.close();
}
catch (exception ex)
{
}
buttonportonoff.text = "打开串口";
}
}
/// <summary>
/// 清空接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonclearrecv_click(object sender, eventargs e)
{
textboxrecv.clear();
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonsenddata_click(object sender, eventargs e)
{
string str = textboxsend.text.tostring(); // 获取发送文本框里的数据
try
{
if (str.length > 0) {
serialport1.write(str); // 串口发送数据
}
}
catch (exception)
{
}
}
/// <summary>
/// 清除发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonclearsend_click(object sender, eventargs e)
{
textboxsend.clear();
}
private void comboboxport_selectedindexchanged(object sender, eventargs e)
{
}
private void comboboxport_mouseclick(object sender, mouseeventargs e)
{
}
}
}
窗体界面设计
运行效果
发表评论