在vs2008编写基于MFC的串口通信,从STM32实时读取数据,遇到读写冲突问题

zyqaly zyqaly 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是串口响应函数,在响应函数中开了个线程,用于处理接受到的数据,数据是一个帧头6.000000后面带四路数据,想要将四路数据分别赋给AD_A,AD_B,AD_C,AD_D四个变量,不知道这样开线程可以?串口读数据的线程和数据处理的线程能不断运行?我想的是串口读数据也是一个线程,那他在他的时间片内运行,时间到,然后调用线程函数运行,线程函数的时间片到,再轮到串口线程运行,我是刚开始写,查了很多资料,也不知道这样到底对不对,希望有人帮帮我,真的卡了好久了。

void CScomDlg::OnComm()
{
// TODO: 在此处添加消息处理程序代码
//################################################################################
hThread1=CreateThread(NULL,0,DataHander,NULL,0,NULL);
CloseHandle(hThread1);

g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");//无信号状态
if(g_hEvent)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
AfxMessageBox("有一个线程在运行");
return;
}
}
SetEvent(g_hEvent);
CloseHandle(g_hEvent);

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
////////以下你可以根据自己的通信协议加入处理代码

Global::DataRuning=1;
variant_inp=m_ctrlComm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);//字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
////此处编译有错误,可在项目属性->配置属性->常规里将“字符集”改为使用多字节字符集即可
strtemp1+=strtemp;
m_strRXData+=strtemp; //接受的传感器的数据,加入接收编辑框对应字符串

}

}
else
Global::DataRuning=0;
UpdateData(FALSE); //更新编辑框内容

}


这是线程响应函数
DWORD WINAPI DataHander(LPVOID lpParameter)
{
while(true)
{
WaitForSingleObject(g_hEvent,INFINITE);

CString s="6.000000";
CString tt=Global::strtemp1;
int n=2;
int N=80;
CString head="0";
for (unsigned int i=0;i<N;)
{
head=tt.Mid(i,8);//MID(a,b)函数,从a位起截取b位
if (!(head.Compare(s)))
{
i+=8;
Global::ad_a=tt.Mid(i,8);
Global::AD_A= atof( Global::ad_a);

i+=8;
Global::ad_b=tt.Mid(i,8);
Global::AD_B= atof( Global::ad_b.GetBuffer());

i+=8;
Global::ad_c=tt.Mid(i,8);
Global::AD_C= atof( Global::ad_c.GetBuffer());


i+=8;
Global::ad_d=tt.Mid(i,8);
Global::AD_D= atof( Global::ad_d.GetBuffer());
i=i+8;

}
else
i++;



if(Global::DataRuning=1)//如果缓冲区有数字,证明数据在更新

{
if(i==72)
{
N=80*n;
n++;
}
}
SetEvent(g_hEvent);
}
}

return 0;

}
...全文

相关推荐

MFC串口助手编译指南:VC环境配置与串口通信原理

串口通信是嵌入式开发和工业调试的基础技术,其核心在于Windows平台下的异步I/O控制、环形缓冲区设计与线程安全机制。本文围绕MFC框架下的串口工具展开,解析CreateFile+WaitCommEvent事件驱动模型、FILE_FLAG_OVERLAPPED异步读写原理,以及VC容器中Platform Toolset与MFC动态链接的关键适配逻辑。技术价值体现在零运行时依赖、确定性低延迟响应和高稳定性——特别适用于PLC调试、STM32 Bootloader烧录及LoRa模块AT指令透传等强实时场景。通

足以不恨

通信行业基于MongoDB的安全合规与性能优化:5G时序数据处理、可查询加密及窗口函数应用

内容概要:本文围绕MongoDB在通信行业的深度应用,系统讲解了可查询加密、时间序列集合、窗口函数与性能诊断四大核心技术。通过详实的代码案例,展示了如何利用可查询加密实现敏感数据合规存储与查询,使用时序集合高效处理5G网络KPI等高频写入场景,借助窗口函数进行经营指标的趋势分析,并结合explain()与查询分析器完成性能调优。文章还涵盖分片一致性检查、索引优化等运维实践,全面覆盖通信系统对安全、性能与扩展性的严苛要求。; 适合人群:具备一定数据库基础,从事通信行业研发、架构或运维工作1-3年的技术人员,尤其是参与5G网络监控、客户数据管理或大数据平台建设的相关人员。; 使用场景及目标:① 实现用户手机号、身份证等敏感信息的加密存储与等值查询,满足安全合规要求;② 构建高吞吐、低延迟的5G基站KPI时序数据存储与分析系统;③ 在数据库层直接完成滑动平均、累计求和等经营分析,减少应用层计算负担;④ 诊断慢查询、验证索引有效性,保障系统高性能运行。; 阅读建议:此资源强调理论与实战结合,建议读者在本地或测试环境部署MongoDB 7.0+版本,动手复现文中代码,重点关注schemaMap配置、时序集合参数选择与窗口函数语法细节,并结合explain执行计划理解底层优化机制,从而真正掌握通信级数据架构的设计精髓。

数智顾问

国央企创新负责人如何借助平台实现技术成果的高价值转化与资源精准配置?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

产业园区运营负责人如何在平台建设中科学配置创新资源,提升园区内技术对接效率?.docx

产业园区运营负责人如何在平台建设中科学配置创新资源,提升园区内技术对接效率?

BIZKEEN

产业园区运营负责人如何提升园区内技术供需匹配的精准度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论 3
收藏 已收藏
分享
返回顶部
zyqaly
进程/线程/DLL 15,466 成员 49,169 内容