日期:2014-05-17  浏览次数:21018 次

单位要我开发上位机软件 串口通讯 懂的朋友进来帮我下
如题,我以前没有接触过串口编程,得知.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);
}
}