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

zhu4139365 2009-09-27 09:29:42

我用C#写的串口通讯软件,串口通讯类用的是.Net的SerialPort类。
不知道为什么,同样的操作,有时候PDA发送的数据能够接收到,有时候接收不到。
而以前别人用Delphi写的串口通讯软件都能和PDA正常通讯。(和我现在做的这个功能一模一样,也是与PDA通讯)并且我们的串口参数:波特率等都设置的一样。
...全文
1097 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这些函数
内容概要:本文探讨了智能体开发在计算机竞赛中的实际应用,涵盖从算法博弈到自动解题Agent的技术实现路径。文章系统介绍了智能体的核心概念及其在OI/ICPC等竞赛场景下的关键技术,包括状态空间建模、奖励塑形、课程学习与代码生成沙箱等方法,并通过“重力迷宫最短路径”这一典型题目展示了从传统BFS算法到基于A3C深度强化学习智能体的演进过程。项目实现了在局部观测环境下智能体的自主决策,并结合课程学习提升训练稳定性,最终通过模型蒸馏、fallback机制和评测对接实现竞赛落地。此外,文章展望了神经符号系统融合、大模型微调与多智能体对练等未来发展方向。; 适合人群:具备一定算法基础和编程经验,熟悉机器学习基本概念,参与或准备参与算法竞赛(如NOI、ICPC、IOI)的学生与开发者。; 使用场景及目标:①将强化学习应用于传统算法题的自动化求解;②在交互题、构造题、博弈题中构建高效智能体以突破人工解题局限;③实现智能体与竞赛评测系统的无缝集成;④探索AI在算法竞赛中的前沿应用趋势。; 阅读建议:建议结合代码实例搭建实验环境,逐步复现从BFS到A3C的演化过程,重点关注状态设计、奖励函数构建与课程学习策略,并尝试将文中技术迁移至其他竞赛题型进行拓展实践。

111,120

社区成员

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

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

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