C#实现串口通信(SerialPort)
需求:C#实现串口通信,输入指令获取指令结果。
-
导入控件SerialPort(导航栏找到工具(T)-->选择工具箱项(X)...),如下图:
2.编写测试类代码(模拟串口进入boot与下发指令):
-
string[] ports = System.IO.Ports.SerialPort.GetPortNames(); //获取电脑所有串口
-
InputSimulator simulator = new InputSimulator(); //好像没用到
-
if (ports.Length == 0)
-
{
-
MessageBox.Show("本机没有串口!");
-
}
-
Array.Sort(ports);
-
sp.PortName = ports[1];//串口号COM3,根据自己需要获取
-
sp.BaudRate = 115200;//波特率
-
sp.DataBits = 8;//数据位
-
sp.StopBits = System.IO.Ports.StopBits.One;//停止位
-
sp.ReadTimeout = 500;//读取数据的超时时间
-
sp.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题
-
-
try
-
{
-
if (sp.IsOpen)
-
{
-
sp.Close();//关闭再打开,相当于初始化
-
sp.Open();//打开串口
-
//这里设置15秒的时间,要先执行代码再给产品上电,否则产品进入串口的窗口时间太短,可能产品已经过了进入boot的窗口,但是代码还没执行Ctrl C的操作,导致进不了boot,时间可以根据自己需要设置,循环一次就是一秒
-
for (int i = 0; i < 15;i )
-
{
-
Thread.Sleep(1000);
-
ToSendMessage("0x03",100); //这里只能用这种方法实现Ctrl C进入串口boot的操作,下面两种都不行
-
//SendKeys.SendWait("^{c}");
-
//simulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);
-
}
-
}
-
else
-
{
-
sp.Close();
-
sp.Open();//打开串口
-
//Ctrl C
-
for (int i = 0; i < 15; i )
-
{
-
Thread.Sleep(1000);
-
ToSendMessage("0x03",100);
-
//SendKeys.SendWait("^{c}");
-
//simulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);
-
}
-
}
-
-
string strTelnetMsg = ToSendMessage("echo OK",1000); //获取发送指令结果
-
if (strTelnetMsg.Contains("OK"))
-
{
-
//打印获取到的正确结果
-
}
-
else
-
{
-
//获取指令结果错误
-
return;
-
}
-
-
}
-
catch (Exception ex)
-
{
-
MessageBox.Show("错误:" ex.Message, "C#串口通信"); //串口异常信息提示
-
}
注意:InputSimulator还需要安装对应的包,如下图:
3.编写发送指令方法,主测试方法调用就行了(十六进制方式没试过):
-
//发送数据(第一个参数是发送的指令,第二个参数是等待指令结果的时间)
-
private String ToSendMessage(string command,int writetime)
-
{
-
String m = "";
-
if (sp.IsOpen)
-
{
-
try
-
{
-
sp.Encoding = System.Text.Encoding.GetEncoding("GB2312");
-
-
//发送数据(类型:十六进制)
-
//sp.Write(strToHexByte(Command), 0, strToHexByte(Command).Length);
-
-
//发送数据(类型:字符串)
-
sp.WriteLine(command);
-
System.Threading.Thread.Sleep(writetime);
-
m = sp.ReadExisting();
-
if (m.Contains("ath>"))
-
{
-
//ath>是我的产品前缀部分,我下指令只想得到指令结果,所以将前缀部分去掉
-
string[] strValue = Regex.Split(m, "ath>", RegexOptions.IgnoreCase);
-
m = strValue[0];
-
}
-
-
//发送成功!
-
}
-
catch (Exception ex)
-
{
-
MessageBox.Show("错误:" ex.Message); //错误信息提示
-
}
-
}
-
else
-
{
-
MessageBox.Show("串口未打开!");
-
}
-
return m; //返回指令结果
-
}
-
// 字符串转换成16进制编码方式
-
private byte[] strToHexByte(string hexString)
-
{
-
hexString = hexString.Replace(" ", "");
-
if ((hexString.Length % 2) != 0) hexString = " ";
-
byte[] returnBytes = new byte[hexString.Length / 2];
-
for (int i = 0; i < returnBytes.Length; i )
-
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
-
return returnBytes;
-
}
SerialPort详细参数解读参考:https://www.cnblogs.com/qyhe/articles/8590968.html
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiibke
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01