单位要我开发上位机软件 串口通讯 懂的朋友进来帮我下
如题,我以前没有接触过串口编程,得知.NET对串口编程有很好的封装,开始搜索相关资料。
首先 是变频器家电,需要把下位机的参数用桌面winform读出来然后转成各个参数表现给用户。单位是用usb接口的
经过一个星期接触,我所了解的知识有以下几点
1. using System.IO.Ports; 命名空间下
SerialPort 串口; //SerialPort类 声明对象
串口= new SerialPort(串口名(), 波特率(), 奇偶性(), 数据位(), 停止位());//用五个方法返值作为五个参数
2. 串口.DataReceived += new SerialDataReceivedEventHandler(串口_DataReceived);//添加接收数据事件
3. private delegate void 委托();//听说用委托来接收数据
private void 接收数据()
{
string 数据 =string.Empty;
数据 = 串口.ReadExisting();//难道这句就是从串口读取下位机参数的函数吗?
this.listBox1.Items.Add(数据);
}
private void 委托方法()
{
this.Invoke(new 委托(接收数据));
}
//以上两个方法是网上搜到的资料 不知对否
4. private void 串口_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread 线程 = new Thread(委托方法);//网上资料说 用一个线程来装这个委托方法 接收数据
}
难道就这么简单吗? 网上看了很多资料 不是断章取义 就是互相抄袭
有说这样写的
int bytes = serialPort1.BytesToRead;
byte[] buffer = new byte[bytes];
if (bytes == 0)
{ return; }
serialPort1.Read(buffer, 0, bytes);
string s100 = ByteArrayToHexString(buffer);//字节数组转为十六进制字符串
richTextBox1.Text += s100 + "\r\n";
我也觉得 应该会有编码传唤的 貌似 “string s100 = ByteArrayToHexString(buffer);”此代码不可少啊
请会的朋友给个完整的思路 一步一步如何下来的 ,小弟不胜感激啊!!!!!
------解决方案--------------------ByteArrayToHexString从字面上看,这个函数有毛病。。什么叫“十六进制字符串”?。。。本来好好的byte数组,非要转成hex的字符串。。
比如串口回来的是"12345"这个字符串,byte数组是0x30,0x31,0x32,0x33,0x34,0x35。。转成HexString就成了"303132333435"。。本来可以直接用的,现在变成没法用了。。
串口接收的数据如果没有封包,可以直接用ReadToEnd得到字符串。。如果中文则用Encoding.GetString。。下面类似。。
如果封包了,需要掐头去尾,然后得到byte[],然后你可以直接用。。或者转。。
一切都是根据你通信的格式来的。。。没有定论。。
------解决方案--------------------ByteArrayToHexString用来输出信息是可以的.
串口我认为有2点注意
1 用多线程读串口,不阻塞主线程
2 接收数据后,根据你的业务逻辑处理数据,基本上用到委托来更新UI
------解决方案--------------------// <summary>
/// 系统参数设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mnuSystemSet_Click(object sender, EventArgs e)
{
if (ComPortValid)
{
using (frmPwd fp = new frmPwd())
{
if (fp.ShowDialog() == DialogResult.OK)
{
//判断COM端口是否已打开
GetTempEnable(false);
try
{
DgLocation = DotLocation(int.Parse(SendReadCmd(Address.A07H)));
}
catch
{
DgLocation = 10;
}
using (frmSysSet fsys = new frmSysSet
(GetSystemProperties(), DgLocation))
{
if (fsys.ShowDialog() == DialogResult.OK)
{
SaveSerialSystemProperties(fsys.SerialSet);
LoadDefaultTemp();
}
}
GetTempEnable(true);
}
}