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

zhu4139365 2009-09-27 09:29:42

我用C#写的串口通讯软件,串口通讯类用的是.Net的SerialPort类。
不知道为什么,同样的操作,有时候PDA发送的数据能够接收到,有时候接收不到。
而以前别人用Delphi写的串口通讯软件都能和PDA正常通讯。(和我现在做的这个功能一模一样,也是与PDA通讯)并且我们的串口参数:波特率等都设置的一样。
...全文
1076 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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这些函数

111,097

社区成员

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

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

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