100分求解地磅串口读取 serialport类

taotaoboy 2007-09-21 12:40:43
地磅参数:
波特率:300/600/900/1200/2400/4800可选
数据位:ASII码,第一位起始位,中间8位数据位,最后一位停止位。每组10位
串行通讯的连续发送:每帧数据共有8组组成。数据传送先低位后高位。每组数据间有分隔符=.如当前毛重是70.15连续发送51.0700=51.0700=.....
我用下面的代码操作,却读不到任何数据。
string returnStr = "";
SerialPort myComPort;
using (myComPort = new SerialPort("com1"))
{
myComPort.BaudRate = 4800;
myComPort.DataBits = 8;
myComPort.StopBits = StopBits.One;
myComPort.Parity = Parity.None;
myComPort.ReadTimeout = 1000;
myComPort.Open();
try
{
//数据读取
string str = myComPort.ReadLine();
//截取字符串
char[] arrayone = str.Trim().Substring(1, 5).ToCharArray();
//字符串反转
char[] array = new char[5];
for (int i = 0; i < 5; i++)
{
array[i] = array[4 - i];
}
returnStr = array.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
txtweight.Text = returnStr;
}
请各位大虾帮助。
...全文
1158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pimlee 2012-02-21
  • 打赏
  • 举报
回复
学习了。正在开发
china1976 2009-11-30
  • 打赏
  • 举报
回复
楼主解决了没有?不知能否无私贴出参考一下啊,急用中!
sdwqs 2009-02-21
  • 打赏
  • 举报
回复
确实波特率是很重要的。
我也正在开发地磅的。学习了。。。。。
sdwqs 2009-02-21
  • 打赏
  • 举报
回复
确实波特率是很重要的。
我也正在开发地磅的。学习了。。。。。
yitaoboy 2007-10-17
  • 打赏
  • 举报
回复
应该是波特率的问题。你可以用串口调试器试试。或者将自己的界面做成参数可选的,这样方便调试
麦壳饼 2007-10-08
  • 打赏
  • 举报
回复
kao 楼上的方法不错 .
david_anwei 2007-10-08
  • 打赏
  • 举报
回复
搂主用这个事件就可以了!
void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

}
xianchengjincheng 2007-10-08
  • 打赏
  • 举报
回复
学习
myflyer 2007-09-26
  • 打赏
  • 举报
回复
先用串口调试工具接受一下试试
很简单的
魏星缘 2007-09-26
  • 打赏
  • 举报
回复
示例改了一下,这次能直接运行了。

using System;
using System.IO.Ports;
using System.Text;

internal class CommPort
{
protected SerialPort commPort = new SerialPort();

private readonly StringBuilder strReceive = new StringBuilder(); // 接收到数据的缓冲区

#region CommPort 构造函数

/// <summary>
/// CommPort 构造函数
/// </summary>
public CommPort()
{
// 初始化串口
commPort.BaudRate = 1200;
commPort.Parity = Parity.Even;
commPort.Encoding = Encoding.UTF8;

// 串口的数据接收事件
commPort.DataReceived += commPort_DataReceived;
}

#endregion

#region commPort_DataReceived 数据抵达

/// <summary>
/// commPort_DataReceived 数据抵达
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
#region 接收数据

// 接收缓冲区中数据的字节数
int int_Len = commPort.BytesToRead;

// 接收数据
byte[] bytes = new byte[int_Len];
commPort.Read(bytes, 0, int_Len);

#endregion

#region 将数据存入缓冲

// 将数据存入字符串缓冲区中
for (int i = 0; i < bytes.Length; i++)
{
strReceive.Append(bytes[i] + " ");
}

#endregion

}
catch (Exception ex)
{

}
}

#endregion

#region IsOpen 测试串口是否已经打开

/// <summary>
/// 测试串口是否已经打开
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
try
{
if (commPort == null) return false;

return commPort.IsOpen;
}
catch (Exception ex)
{
}

return false;
}

#endregion

#region Open 打开串口

/// <summary>
/// 打开串口
/// </summary>
/// <returns></returns>
public bool Open()
{
try
{
if (!commPort.IsOpen)
{
commPort.Open();
}

return true;
}
catch (Exception ex)
{
return false;
}
}

#endregion

#region Close 关闭串口

/// <summary>
/// 关闭串口
/// </summary>
/// <returns></returns>
public bool Close()
{
try
{
if (commPort.IsOpen)
{
commPort.Close();
}

return true;
}
catch (Exception ex)
{
return false;
}
}

#endregion

#region Write 往串口中写数据

/// <summary>
/// 往串口中写数据
/// </summary>
public void Write(byte[] bytes)
{
try
{
if (commPort.IsOpen)
{
commPort.Write(bytes, 0, bytes.Length);
}
else
{
Open();
commPort.Write(bytes, 0, bytes.Length);
}
}
catch (Exception ex)
{
}
}

#endregion
}

魏星缘 2007-09-26
  • 打赏
  • 举报
回复
你可以用我给你提供的那个示例代码调一下,看看 strReceive 最后显示的是什么值。

第一次读出缓冲区中字节数为8,但是后面就每次都为0了.

本来数据传过来,就是分次传的,在把所有的数据接收完后,来拆分成一条条完整的数据才行。
taotaoboy 2007-09-21
  • 打赏
  • 举报
回复
我现在采用datareceive事件可以接收到数据了,但是我们的二次仪表是连续发送数据的.导致我不方便分析.难道用mscomm控件就可以轻易的解决这个问题吗
taotaoboy 2007-09-21
  • 打赏
  • 举报
回复
我后面改成
SerialPort myComPort;
using (myComPort = new SerialPort("com1"))
{
myComPort.BaudRate = 9600;
myComPort.DataBits = 8;
myComPort.StopBits = StopBits.One;
myComPort.Parity = Parity.None;
myComPort.ReadTimeout = 1000;
myComPort.Open();
try
{
// 接收缓冲区中数据的字节数
int int_Len = myComPort.BytesToRead;
MessageBox.Show(int_Len.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
第一次读出缓冲区中字节数为8,但是后面就每次都为0了,救命啊
saiwong 2007-09-21
  • 打赏
  • 举报
回复
收藏,帮顶
chuxue1342 2007-09-21
  • 打赏
  • 举报
回复
帮顶!
skyell 2007-09-21
  • 打赏
  • 举报
回复
string str = myComPort.ReadLine();

楼主你用这个方法接收数据,你确定接收的都是可见字符么??
还是用接收byte流吧,不要接收转化字符串
魏星缘 2007-09-21
  • 打赏
  • 举报
回复
给你一个代码示例吧。

这是我的串口程序中所使用的部分代码,一定要注意BaudRate,如果设错了是收不到数据的。

internal class CommPort
{
protected SerialPort commPort = new SerialPort();
private readonly int int_Loc = 0;

private readonly StringBuilder strReceive = new StringBuilder(); // 接收到数据的缓冲区

#region CommPort 构造函数

/// <summary>
/// CommPort 构造函数
/// </summary>
public CommPort()
{
// 初始化串口
commPort.BaudRate = 1200;
commPort.Parity = Parity.Even;
commPort.Encoding = Encoding.UTF8;

// 串口的数据接收事件
commPort.DataReceived += commPort_DataReceived;
}

#endregion

#region commPort_DataReceived 数据抵达

/// <summary>
/// commPort_DataReceived 数据抵达
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Base.int_Cmd_States[int_Loc] = (Base.int_Cmd_States[int_Loc] / 20) * 20 + 1;

#region 接收数据

// 接收缓冲区中数据的字节数
int int_Len = commPort.BytesToRead;

// 接收数据
byte[] bytes = new byte[int_Len];
commPort.Read(bytes, 0, int_Len);

#endregion

#region 将数据存入缓冲

// 将数据存入字符串缓冲区中
for (int i = 0; i < bytes.Length; i++)
{
strReceive.Append(bytes[i] + " ");
}

#endregion

}
catch (Exception ex)
{
frmMain.WriteSysMsg(ex.StackTrace, "[CommPort] 数据接收不成功.", ex.Message);
}
}

#endregion

#region List 获取串口的列表

/// <summary>
/// List 获取串口的列表
/// </summary>
/// <returns></returns>
public static ArrayList List()
{
try
{
ArrayList al = new ArrayList();

ManagementClass mc = new ManagementClass("Win32_SerialPort");
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
al.Add(mo["DeviceID"].ToString());
}

return al;
}
catch (Exception ex)
{
MessageBox.Show("程序发生错误 \n\n错误描述: [严重错误]\n" +
"列出计算机上所有串口时出错. " + "\n\n 错误原因: \n" + ex.StackTrace + "\n\n错误反馈: \n" + ex.Message);
return null;
}
}

#endregion

#region IsOpen 测试串口是否已经打开

/// <summary>
/// 测试串口是否已经打开
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
try
{
if (commPort == null) return false;

return commPort.IsOpen;
}
catch (Exception ex)
{
}

return false;
}

#endregion

#region Open 打开串口

/// <summary>
/// 打开串口
/// </summary>
/// <returns></returns>
public bool Open()
{
try
{
if (!commPort.IsOpen)
{
commPort.Open();
}

return true;
}
catch (Exception ex)
{
return false;
}
}

#endregion

#region Close 关闭串口

/// <summary>
/// 关闭串口
/// </summary>
/// <returns></returns>
public bool Close()
{
try
{
if (commPort.IsOpen)
{
commPort.Close();
}

return true;
}
catch (Exception ex)
{
return false;
}
}

#endregion

#region Write 往串口中写数据

/// <summary>
/// 往串口中写数据
/// </summary>
public void Write(byte[] bytes)
{
try
{
if (commPort.IsOpen)
{
commPort.Write(bytes, 0, bytes.Length);
}
else
{
Open();
commPort.Write(bytes, 0, bytes.Length);
}
}
catch (Exception ex)
{
}
}

#endregion
}

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧