社区
硬件/系统
帖子详情
串口接收到的数据如何显示在编辑框中显示出来?
ms_wqs
2003-09-27 09:19:23
有没用MSCOMM做串口数据接收并显示数据这部分的代码。
怎样把接收到的数据转换为CString类型的并通过编辑框显示出来。
高分求教!
...全文
954
7
打赏
收藏
串口接收到的数据如何显示在编辑框中显示出来?
有没用MSCOMM做串口数据接收并显示数据这部分的代码。 怎样把接收到的数据转换为CString类型的并通过编辑框显示出来。 高分求教!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bluebohe
2003-10-03
打赏
举报
回复
搂主的问题说的不大详细,如果接收到的是字符的话,可以直接添加到编辑框的CString类型导出变量中,然后用UpdateData就行了
Skt32
2003-10-03
打赏
举报
回复
基于VC的串行通信技术应用实例
(中国计算机报 李湘江 2001年10月25日 17:33)
在工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
本文将介绍在Windows平台下串行通信的工作机制和用Visual C++设计串行通信程序的编程方法及通信方式。
VC中实现串行通信的编程技术
以下我们将介绍VC中几种实现串行通信的编程技术:
利用VC++的标准通信函数
利用VC++的标准通信函数_inp和_outp可实现串口通信。下面是一个串口初始化的程序:
void init_com(PORT)
{char i;
outp(PORT+3,0x80);
outp(PORT,0x0C);
outp(PORT+1,0);
outp(PORT+3 ,0x3a);
outp(PORT+3 ,0x03);
i=inp(PORT+5) && 0xfe;
outp(PORT+5,i);}
使用串行通信控件MSComm
串行通信控件MSCOmm32.OCX提供了使用RS-232来进行数据通信的所有协议,VC为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置。它使用户能够方便地访问Windows串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性。以下是通过设置控件属性对串口进行初始化的实例:
BOOL CSampleDlg:: PortOpen()
{ BOOL m_Opened;
......
m_Serial.SetCommPort(2); // 指定串口号
m_Serial.SetSettings("4800,N,8,1");
// 通信参数设置
m_Serial.SetInBufferSize(1024);
// 指定接收缓冲区大小
m_Serial.SetInBufferCount(0);
// 清空接收缓冲区
m_Serial.InputMode(1);
// 设置数据获取方式
m_Serial.SetInputLen(0);
// 设置读取方式
m_Opened=m_Serail.SetPortOpen(1);
// 打开指定的串口
return m_Opened;}
打开所需串口后,我们需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。
使用API函数
控件虽然简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信的应用场合下,控件的使用显得捉襟见肘。API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列很复杂的函数和消息集合。它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。
通信程序在CreateFile处指定串口设备及相关的操作属性,再返回一个句柄,该句柄将被用于后续的通信操作,并贯穿整个通信过程。串口打开后,其属性被设置为默认值,根据具体需要,通过调用GetCommState(hComm,&&dcb)读取当前串口设备控制块DCB设置,修改后通过SetCommState(hComm,&&dcb)将其写入。运用ReadFile()与WriteFile()这两个API函数实现串口读写操作,若为异步通信方式,两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用WaitForSingleObject()来等待结束信号并设置最长等待时间,举例如下:
BOOL bReadStatus;
bReadStatus = ReadFile( m_hIDComDev, buffer,
dwBytesRead, &&dwBytesRead, &&m_OverlappedRead );
if(!bReadStatus){
if(GetLastError()==ERROR_IO_PENDING){
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesRead);}
return(0);}
return ((int)dwBytesRead);
多线程下实现串行通信
Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Windows区分两种不同类型的线程,一种是用户界面线程(User Interface Thread),它包含消息循环或消息泵,用于处理接收到的消息;另一种是工作线程(Work Thread),它没有消息循环,用于执行后台任务、监视串口事件的线程即为工作线程。
多线程程序的编写在端口的配置,连接部分与单线程的相同,在端口配置完毕后,最重要的是根据实际情况,建立多线程之间的同步对象,如信号灯、临界区和事件等。
一切就绪后即可启动工作线程,程序如下:
CWinThrea CommThread = AfxBegin
Thread(CommWatchThread, // 线程函数名
(LPVOID) m_pTTYInfo, // 传递的参数
THREAD_PRIORITY_ABOVE_NORMAL,
// 设置线程优先级
(UINT) 0, // 最大堆栈大小
(DWORD) CREATE_SUSPENDED , // 创建标志
(LPSECURITY_ATTRIBUTES) NULL);
if(WaitCommEvent(pTTYInfo->idComDev,&&dwEvtMask,NULL))
{
if((dwEvtMask && pTTYInfo->dwEvtMask )== pTTYInfo->dwEvtMask)
{
WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF);
ResetEvent(pTTYInfo->hPostEvent);
// 置同步事件对象为非信号态
::PostMessage(CSampleView,ID_COM1_DATA,0,0); // 发送通知消息}}
BEGIN_MESSAGE_MAP(CSampleView, CView)
//{{AFX_MSG_MAP(CSampleView)
ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data)
ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)
.....
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
多线程的实现可以使得各端口独立,准确地实现串行通信,使串行通信具有更广泛的灵活性与严格性,且充分利用CPU时间。但在具体的实时监控系统中如何协调多个线程、线程之间以何种方式实现同步,这是多线程串行通信程序实现的难点。
串行通信的操作方式
下面我们将介绍串行通信的几种操作方式:
编辑 吴北 jiaoxq@staff.ccidnet.com)
Skt32
2003-10-03
打赏
举报
回复
串口调试助手VC源程序
及编程详细过程
作者:龚建伟
可以任意转载,注明作者和说明来自 ◆龚建伟技术主页◆
http://www.csdn.net/develop/article/10/10199.shtm
tyro_zhang
2003-09-30
打赏
举报
回复
有些字符是不能直接显示的,注意转换后再显示
Pipi0714
2003-09-29
打赏
举报
回复
VARIANT vt = m_ctrlComm.GetInput();
CString str;
str = (LPCTSTR)(_bstr_t)vt; //就可以了
zhangnanonnet
2003-09-28
打赏
举报
回复
我没有用过MSCOMM,我都是用API接收串口数据的,不过我觉得应该大同小异,如果接收过来的数据是char *类型的话,比如:
char * cRev;
CString value;
value = cRev;就可以了,至于在编辑框显示,只要把编辑框的变量定义成CSTRING类型的,直接赋值,完了用updatedata(FALSE)就可以了
duyhui
2003-09-28
打赏
举报
回复
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
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.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
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存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
m_strRXData,是你最后想要显示的CString
浙江大学C语言上机练习题及答案
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 浙江大学C语言上机练习题及参考答案第2周(M2) 220011 计算华氏温度100°F所对应的摄氏温度值。 220012 计算华氏温度150°F所对应的摄氏温度值。 320013 计算摄氏温度26°C所对应的华氏温度值。 320015 当n为152时,分别计算出n的个位数字(digit1)、十位数字(digit2)以及百位数字(digit3)的数值。 320026 接收两个整数 num1 和 num2 的输入,计算并输出它们的和、差、积、商以及余数。 4第3周(M3) 520031 计算求和1+2+3+......+100(调试示例error02_5)。 520032 计算求和m+(m+1)+(m+2)+......+100。 520033 计算求和1/m+1/(m+1)+1/(m+2)+......+1/n。 620034 计算求和1 + 1/3 + 1/5 + ......的前n项和。 720035 计算求和1-1/4+1/7-1/10+……的前n项之和。 720036 输出华氏-摄氏温度转换表(改错题error02_6)。 820038 计算x的n次幂值。 920041 生成 3 的乘方表。 1020044 计算求和100^0.5+101^0.5+……+1000^0.5。 1020053 计算物体自由下落的距离值。 1120056 计算分段函数的值。 1120061 计算阶梯电价。 1220062 计算求和m*m+1/m+(m+1)*(m+1)+1/(m+1)+(m+2)*(m+2)+1/(m+2)+......+n*n+1/n。 1320063 计算求和1-2/3+3...
2002-2022 塔里木河流域及其毗邻地区0.1°地下水储量月度变化实验
数据
集(tif)
从像元时间连续性出发采用半监督变分自编码器算法(SSVAER),以及基于像元空间相关性采用多尺度地理加权回归模型(MGWR)。以塔里木河流域为研究区,采用德克萨斯大学奥斯汀分校空间研究
中
心(CSR-RL06M)和喷气推进实验室(JPL-RL06M)两种GRACE发行机构的Mascon产品均值作为
数据
源,时间尺度为2002年4月至2022年6月,共210个月。预测因子选择降水、雪水当量、陆地表面温度、蒸发、径流和NDVI。两种方案均实现了GRACE反演地下水储量异常(GWSA)空间分辨率从0.5°提高至0.1°。研究结果表明:在80%以上的研究区域内,降尺度前后的GWSA
数据
相关性介于0.94-0.98之间;基于SSVAER和MGWR两种方案分别将GWSA与地下水位之间的相关性从0.27提高至0.59和0.52。均方根误差均低于8。本
数据
集内容包括:(1)基于SSVAER方案的降尺度结果;(2)基于MGWR方案的降尺度结果。该
数据
集以.tif格式存储,空间分辨率为0.1°。
数据
集由420个
数据
文件组成,
数据
量为62.2 MB(压缩为1个文件,50.1 MB)。
TCL原厂刷机包 MS801
淘宝上买来的,刷机正常,救回电视了。
【CTF-OSINT-图片】根据图片exif信息定位位置
【CTF-OSINT-图片】根据图片exif信息定位位置
省、地级市
数据
知识产权试点DID(2000-2025年)
01、
数据
简介 2022年11月,国家知识产权局正式启动了首批
数据
知识产权地方试点工作,明确将北京、上海、江苏、浙江、福建、山东、广东以及深圳列为试点地区,试点时间跨度为2022年11月至2023年12月。 至2023年12月,国家知识产权局又进一步确定了第二批试点地区,在首批8个试点地区的基础上,新增了天津、河北、山西、安徽、河南、湖北、湖南、贵州和陕西,第二批试点的时间为2023年12月至2024年11月。
数据
名称:省、地级市
数据
知识产权试点DID
数据
年份:2000-2025年 02、相关
数据
年份 省份 省份代码 地级市 地级市代码 所属地域 胡焕庸线
数据
知识产权试点时间 Treat Post DID
硬件/系统
2,643
社区成员
17,229
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章