[求助]串口开发,读取数据错乱

ITripleTong 2017-07-11 01:44:54
出现问题是这样的:
1.当我程序运行起来,串口已经打开准备接收数据,这时用串口助手向串口发送数据,数据正常。
2.但是我先用串口助手不停发数据,然后再打开写的程序接收程序,数据出现错乱,这里的错乱不是指顺序错乱,而是出现了发送数据里根本没有的数据。

不停发送的是16字节数据:AA 00 00 08 00 00 00 01 00 AA 00 00 AA 00 AA
情况1数据正常:

情况2数据错乱:


出现了根本没有的数据。

我用两个串口助手互传,都接收正常,肯定是程序的问题。所以希望大神们帮我看一看代码。
我准备用的是线程+同步IO读取。

我先是用C++写,之后用C#写均出现这个问题。
C++的代码:
void SETUP_DCB()
{
DCB dcb;
memset(&dcb, 0, sizeof(DCB) );
GetCommState(hComFile, &dcb);
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600; //波特率
dcb.fParity = FALSE; //无奇偶校验
dcb.Parity = NOPARITY; //无校验
dcb.StopBits = ONESTOPBIT; //1位停止位
dcb.ByteSize = 8; //数据位数
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
SetCommState(hComFile, &dcb);
}

hComFile = CreateFile(L"COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hComFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hComFile);
return TRUE;
}
SETUP_DCB();
hThread = CreateThread(NULL, 0, MyThreadFunction, NULL, 0, &ThreadID);

读取线程的代码
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
...
i = ReadCount;
while (i)
{
ClearCommError(hComFile, &Errors, &comstat);
ReadFile(hComFile, pBuffer + ReadCount - i, i, &NumberOfRead, NULL);
i -= NumberOfRead;
}
...
}


C#写测试,也读取乱码
 _serialPort = new SerialPort();
_serialPort.PortName = "com3";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.XOnXOff;

_serialPort.Open();

for (int i = 0; i < 17; i++)
{
BUFFER[i] = (byte)_serialPort.ReadByte();
}
...全文
1399 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2017-07-29
  • 打赏
  • 举报
回复
1 检查波特率,校验/停止位等设置是否一致 2 串口是流式设备, 因此应该设计合适的帧协议,以区分上下文
lr2131 2017-07-29
  • 打赏
  • 举报
回复
回环测试,检查软件逻辑问题! 还有问题,在检查硬件方面的问题!
worldy 2017-07-11
  • 打赏
  • 举报
回复
串口助手打开了串口,你的mfc程序要打开会返回失败,检查返回值
worldy 2017-07-11
  • 打赏
  • 举报
回复
串口被占用,不能再次打开
内容概要:本文围绕基于PI双闭环解耦控制的三相电压型PWM整流器在第四象限运行的仿真研究展开,重点分析其在电流反向流动工况下的控制性能。通过Simulink搭建系统模型,采用电压外环与电流内环构成的双闭环PI控制策略,并引入d-q轴解耦环节以消除交叉耦合影响,实现对整流器在能量回馈状态下的高精度、稳定控制。研究涵盖了系统数学建模、控制器参数设计、解耦算法实现及动态响应仿真验证,充分展示了该控制方法在抑制扰动、提升系统鲁棒性方面的有效性。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事新能源变流器、电能质量治理或工业传动系统开发的工程技术人员;具备自动控制理论基础和Simulink仿真能力者更佳。; 使用场景及目标:①深入掌握三相电压型PWM整流器的工作原理及其在不同运行象限的能量流动特性;②理解并实践PI双闭环控制系统的设计思路与参数整定方法;③学习d-q坐标系下电流解耦控制的实现机制;④熟练运用Simulink进行电力电子系统建模与仿真分析;⑤为实际工程中实现高效能量双向变换提供理论依据与技术参考。; 阅读建议:建议结合Simulink环境同步搭建模型,细致分析各模块的信号流向与控制逻辑,重点关注电流内环的动态跟踪能力和电压外环的稳态调节性能,可通过改变负载突变、电网电压波动等条件进行对比实验,进一步评估系统的抗干扰能力与稳定性表现。

2,432

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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