C#串口通讯接收不到数据

zhu4139365 2009-09-27 09:29:42

我用C#写的串口通讯软件,串口通讯类用的是.Net的SerialPort类。
不知道为什么,同样的操作,有时候PDA发送的数据能够接收到,有时候接收不到。
而以前别人用Delphi写的串口通讯软件都能和PDA正常通讯。(和我现在做的这个功能一模一样,也是与PDA通讯)并且我们的串口参数:波特率等都设置的一样。
...全文
1023 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxjwanghao 2010-07-24
  • 打赏
  • 举报
回复
怎样解析反馈的信号
zjhiphop2006 2009-09-27
  • 打赏
  • 举报
回复
如果连接都没有问题的话,应该就是数据接收不完全,需要延迟接收,建议使用SerialPort 试试
freeboy827 2009-09-27
  • 打赏
  • 举报
回复
上你的代码啊
或者你用串口调试助手试试
trentliu 2009-09-27
  • 打赏
  • 举报
回复
串口通信的特点就是不可靠,很可能不定时的才能填满接收缓冲区。

1. 要么分成很小的包,连续发送,接收处理。(程序设计方面)

2. 你说的可能不是接收不到,虽然触发了接收事件,但是数据只过来了一部分。
假设在接收事件中,触发了事件,你不能马上提取数据处理, 做一个小的延时,500-1000 毫秒,这样效果会更好,缓冲区会填冲更多数据,可以提高接收完整的比率。

建议,在发送端给流加上crc验证,接收端加上延时和crc验证包完整度,这样的通信更可靠,更准确。
ttiimm11 2009-09-27
  • 打赏
  • 举报
回复
先检查一下你的RS232线有没有接对,我就一次,犯了这样低级的错误,害的我断点跑了一次又一次
mywisest 2009-09-27
  • 打赏
  • 举报
回复
PDA的AT命令应该不太一样吧,看看AT命令参考。
hyblusea 2009-09-27
  • 打赏
  • 举报
回复
我以前GOOGLE到的代码:

using System.IO.ports;

SerialPort myPort = new SerialPort();

//初始化端口:
myPort.PortName = "com1"; //端口名
myPort.BaudRate = 115200; //速率
myPort.DataBits = 8; //数据位 
myPort.StopBits = StopBits.One; //停止位
myPort.Parity = Parity.None; //奇偶校验
myPort.RtsEnable = true; // 打开RTS ,这步很重要



//下面这个方法将在指定的时间内接收串口数据并写入二进制文件。

public void getRawData(SerialPort port, string fileName, int seconds)
{
FileStream f1;
try
{
port.open(); // 打开端口
}
catch (Exception err)
{
   Console.WriteLine(err.ToString()); //端口打开失败,返回
return;
}
try
{
f1 = new FileStream(fileName, FileMode.Append);
}
catch (Exception err)
{
Console.WriteLine(err.ToString()); //文件打开失败,返回
return;
}

    Console.WriteLine("Data will be logged from " + port.PortName + " for " + seconds + " seconds...");
BinaryWriter b1 = new BinaryWriter(f1);
DateTime now = DateTime.Now; // 获取当前系统时间
while (((TimeSpan)(DateTime.Now - now)).TotalSeconds < seconds) 检测当前时间是否到了指定结束时间长度
{
b1.Write((byte)port.ReadByte()); //写串口数据到文件
}

b1.Close();
f1.Close();
  port.Close();
}

trentliu 2009-09-27
  • 打赏
  • 举报
回复
如果传输速率慢,你的传输数据量偏大,再稍微添加些延时。 接收完整率会提高
trentliu 2009-09-27
  • 打赏
  • 举报
回复
如果传输速率慢,你的传输数据量偏大,再稍微添加些延时。 接收完整率会提高
trentliu 2009-09-27
  • 打赏
  • 举报
回复
private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 添加一个500 毫秒的延时
thread.sleep(500);
...
...
...
}
zhu4139365 2009-09-27
  • 打赏
  • 举报
回复

private void Form2_Load(object sender, EventArgs e)
{
try
{

//设置焦点在发送框
this.txtSend.Focus();
//设置发送框的光标位置
txtSend.SelectionStart = txtSend.Text.Length;
txtSend.ScrollToCaret();

//加载端口参数配置
PortConfig.SetPortPara(spComPort);
//打开串口连接
spComPort.Open();
}
catch (Exception ex)
{
ShowMessageBox.Message_Information(ex.Message);
}
}

#region 配置串口参数
/// <summary>
/// 配置串口参数
/// </summary>
/// <param name="spPort"></param>
public static void SetPortPara(SerialPort com)
{
try
{
//串口连接的奇偶校验位
setParity(com);
//串口连接的停止位数
setStopBits(com);
//串口连接的流控制
setHandshake(com);
//数据位
setDataBits(com);
//波特率
setBaudRate(com);
//COM端口
setPortName(com);

//com.ReadTimeout = 1000;
//com.Encoding = Encoding.GetEncoding("gb2312");
}
catch (Exception ex)
{
throw ex;
}
}

/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
//检查串口是否打开,若未则打开
if (spComPort.IsOpen == false)
{
spComPort.Open();
}

//获取接收数据的字节数组
byte firstByte = Convert.ToByte(spComPort.ReadByte());
int bytesRead = spComPort.BytesToRead;
byte[] byteData = new byte[bytesRead + 1];
byteData[0] = firstByte;
for (int i = 1; i <= bytesRead; i++)
{
byteData[i] = Convert.ToByte(spComPort.ReadByte());
}

//解析接收到得数据码
ResolveAcceptData(byteData);
}
catch (Exception ex)
{
ShowMessageBox.Message_Information(ex.Message);
}
}
zhu4139365 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zjhiphop2006 的回复:]
如果连接都没有问题的话,应该就是数据接收不完全,需要延迟接收,建议使用SerialPort 试试
[/Quote]
我用的就是SerialPort
zhu4139365 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hyblusea 的回复:]
我以前GOOGLE到的代码:
C# codeusing System.IO.ports;

SerialPort myPort=new SerialPort();//初始化端口:myPort.PortName="com1";//端口名myPort.BaudRate=115200;//速率myPort.DataBits=8;//数据位 myPort.StopBits= StopBits.One;//停止位myPort.Parity= Parity.None;//奇偶校验myPort.RtsEnable=true;// 打开RTS ,这步很重要//下面这个方法将在指定的时间内接收串口数据并写入二进制文件。publicvoid getRawData(SerialPort port,string fileName,int seconds)
{
FileStream f1;try
{
port.open();// 打开端口 }catch (Exception err)
{
   Console.WriteLine(err.ToString()); //端口打开失败,返回return;
}try
{
f1=new FileStream(fileName, FileMode.Append);
}catch (Exception err)
{
Console.WriteLine(err.ToString()); //文件打开失败,返回return;
}

    Console.WriteLine("Data will be logged from"+ port.PortName+" for"+ seconds+" seconds...");
BinaryWriter b1=new BinaryWriter(f1);
DateTime now= DateTime.Now; // 获取当前系统时间while (((TimeSpan)(DateTime.Now- now)).TotalSeconds< seconds) 检测当前时间是否到了指定结束时间长度
{
b1.Write((byte)port.ReadByte());//写串口数据到文件 }

b1.Close();
f1.Close();
  port.Close();
}
[/Quote]

myPort.RtsEnable = true; // 打开RTS ,这步很重要
我的RtsEnable 默认是false,程序也没有改动,是不是这个问题?
辉太郎 2009-09-27
  • 打赏
  • 举报
回复
SerialPort类有一个接收数据的事件DataReceived,触发这个事件时,再去读取数据。读不到数据也可能是缓存区没有及时清理的问题。 这是做串口设备时的解决办法,不知道对你的问题有没有帮助。
smallmaster 2009-09-27
  • 打赏
  • 举报
回复
.net compact的串口操作有问题,用opennetcf或者自己写咯,用P/Invoke调用CreateFile这些函数
C#串口介绍以及简单串口通信程序设计实现 源代码和串口程序介绍连接:https://www.cnblogs.com/JiYF/p/6618696.html 本站积分太贵,自己变得。。直接到连接地址下载代码 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍   串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度) 串口应用:   工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电) RS232 DB9介绍: 1.示意图 2.针脚介绍: 载波检测(DCD) 接受数据(RXD) 发出数据(TXD) 数据终端准备好(DTR) 信号地线(SG) 数据准备好(DSR) 请求发送(RTS) 清除发送(CTS) 振铃指示(RI) 3.实物图: 以下是我购买XX公司的一个usb转串口线:这个头就是一个公头,另一端是一个usb口 笨小孩串口工具运行图: 1.开启程序 2.发送一行字符串HelloBenXH,直接将针脚的发送和接收链接起来就可以测试了(针脚2 接受数据(RXD) 和3 发出数据(TXD))直接链接, C#代码实现:采用SerialPort 1.实例化一个SerialPort [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 private SerialPort ComDevice = new SerialPort(); 2.初始化参数绑定接收数据事件 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 public void init() { btnSend.Enabled = false; cbbComList.Items.AddRange(SerialPort.GetPortNames()); if (cbbComList.Items.Count > 0) { cbbComList.SelectedIndex = 0; } cbbBaudRate.SelectedIndex = 5; cbbDataBits.SelectedIndex = 0; cbbParity.SelectedIndex = 0; cbbStopBits.SelectedIndex = 0; pictureBox1.BackgroundImage = Properties.Resources.red; ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件 }

110,534

社区成员

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

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

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