首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

单位要小弟我开发下位机软件 串口通讯 懂的朋友进来帮小弟我上

2012-09-16 
单位要我开发上位机软件 串口通讯 懂的朋友进来帮我下如题,我以前没有接触过串口编程,得知.NET对串口编程

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


else
{
MessageBox.Show(Properties.Resources.PortValid,
Properties.Resources.MsgTitle, MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

}
[解决办法]
DataReceived事件是由Windows触发的,和你没关系,你也没法干涉。。

如果不想这样,那么可以在单独线程里死循环轮询接收数据。。如3楼所言。。
[解决办法]
搜索引擎上资料一大把
为何 不自己找
[解决办法]
搞串口几年了
给楼主简单说说吧,有需要可以联系我
步骤大概如下:
1、连接设备到电脑串口
2、程序内使用指定串口参数打开串口,即new一个SerialPort,然后Open
3、读写串口,使用Read方法或者其他读取方法,这个根据需要,使用线程去读取还是使用SerialPort的接收事件读取根据你自己的便利。
4、处理读取到的数据
有不明白的可以继续问
不想麻烦给钱我帮你搞定一切
呵呵
[解决办法]
端口访问拒绝
说明你的串口已经在其他地方打开了
有没有数据可以单步调试
看有没有进接收事件
如果没进看你事件有注册没
如果进了没读出数据,请检查你下位机有发生数据没
最简单的请使用串口监视精灵类的串口监视工具
这类工具可以在不占用串口资源的情况下监视串口数据的收发,便于你分析问题
[解决办法]
15楼确实厉害
[解决办法]
路过看看学习了,我现在也在用C#做上位机感觉还是不错的。
[解决办法]
你是不是在调试一次后就发现端口拒绝访问了?
是你在关闭调试时没有关闭已经打开的串口了吧:
if(sp.IsOpened)
{
sp.Close();
}

热点排行