QQ登录

只需一步,快速开始

316上位机VC MFC实现串口RS232发送与接收数据

[ 复制链接 ]

316上位机VC MFC实现串口RS232发送与接收数据

316上位机VC MFC实现串口RS232发送与接收数据

串口RS232发送与接收数据
功能展示
串口在我们工控领域极为常见,如各品牌PLC触摸屏智能仪表都支持串口的通讯与控制,也都提供有串口通讯手册供我们编写上位机程序控制,我们当前例程为串口程序编写,实现串口的打开,设置,数据的发送与接收功能,效果如图,点击<打开串口>可打开指定串口,点击<设置串口>可以设置已打开串口的具体参数,点击<发送框内容>会将编辑框内容发送出,程序后台还有线程接收串口数据;

要点提示
在微软WIN32环境下,串口资源都是作为文件对象来操作的,所以可以将串口与其他智能通讯设备作为文件来对待。打开一个串口可以用CreateFile(),发送数据可以用WriteFile(),读取串口数据可以用ReadFile();
下面简单介绍三个函数的用法,更为具体的函数介绍可以翻阅MSDN;
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
参数说明:
lpFileName 要打开的文件的名或设备名如果”com1”。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
dwDesiredAccess指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 。
另外更多控制标志不具体列出
dwShareMode, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功只要删除访问请求;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问;如果是FILE_SHARE_WRITE 随后打开操作对象会成功只有请求写访问。
lpSecurityAttributes, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition,下述常数之一:
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 将现有文件缩短为零长度

dwFlagsAndAttributes, 一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile 为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。
返回值
如执行成功,则返回文件句柄。
INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
参数说明:
HANDLE hFile, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。
LPVOID lpBuffer,接收数据的缓冲区。
DWORD nNumberOfBytesToRead,指定要读取的字节数。
LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。
LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。
FILE_FLAG_OVERLAPPED?允许对文件进行重叠操作

BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
参数 类型及说明:
hFile Long,一个文件的句柄
lpBuffer Any,参数类型:指针,指向将写入文件的?数据缓冲区
nNumberOfBytesToWrite Long,要写入数据的字节数量。如写入零字节,表示什么都不写入,但会更新文件的“上一次修改时间”。针对位于远程系统的命名管道,限制在65535个字节以内
lpNumberOfBytesWritten Long,实际写入文件的字节数量(此变量是用来返回的 )
lpOverlapped OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值)

实现功能
1.新建基于对话框的应用程序
2.拖拽一编辑框IDC_EDIT1,用于向串口发送数据的输入设置,依次添加按钮控件<打开串口><设置串口><发送框内容>关联按钮的点击函数
void CGkbc8Dlg::OnButton1() //打开串口
{
m_hCom = CreateFile("COM4", //打开串口1
GENERIC_READ|GENERIC_WRITE, //允许读和写操作
0, //独占方式
NULL,
OPEN_EXISTING, //打开一个存在的串口
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //异步方式打开
NULL
);
if (m_hCom==INVALID_HANDLE_VALUE)
MessageBox("端口打开失败");
else
MessageBox("端口打开成功");
}

void CGkbc8Dlg::OnButton2()
{
SetupComm(m_hCom,1024,1024); //设置发送和接收缓冲区大小
DCB dcb;
GetCommState(m_hCom,&dcb); //获得串口默认信息
dcb.BaudRate = 9600;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.ByteSize = 8;
dcb.Parity = ODDPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(m_hCom,&dcb))//设置串口信息
{
MessageBox("串口参数设置失败","提示");
return;
}
if (!SetCommMask(m_hCom,EV_RXCHAR | EV_TXEMPTY))
{
MessageBox("串口掩码设置失败","提示");
return;
}
//创建线程 监控与接收串口数据
HANDLE hThread;//线程句柄
DWORD param;
DWORD dwThreadID;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,&#182;m,0,&dwThreadID);
if (hThread==INVALID_HANDLE_VALUE)
MessageBox("串口线程创建失败","提示",64);
}
void CGkbc8Dlg::OnButton3()
{
CString sData;
DWORD res;
DWORD factdata = 0;

GetDlgItemText(IDC_EDIT1,sData);//创建一个事件对象
wOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
IsStop = FALSE;
//开始发送数据
if (WriteFile(m_hCom,sData,sData.GetLength(),&factdata,&wOverLaped))
{
IsStop = TRUE;
MessageBox("发送成功");
}
else
{
res = WaitForSingleObject(wOverLaped.hEvent,5000); //延时5秒,等待数据发送
if (WAIT_OBJECT_0 == res) //如果事件处于有信号状态,表示发送完成
{
IsStop = TRUE;
}
else
IsStop = FALSE;
Sleep(1000); //延时1秒钟
}
}
3.在主对话框源文件顶部添加变量及线程函数
OVERLAPPED tOverLaped= {0}; //线程函数使用的OVERLAPPED结构
OVERLAPPED wOverLaped = {0}; //写操作使用的 OVERLAPPED结构
OVERLAPPED rOverLaped = {0}; //读操作使用的 OVERLAPPED结构
BOOL IsWaitExit = FALSE; //安全退出线程用
BOOL IsStop = FALSE; //数据是否发送完毕
DWORD ThreadFunction(LPVOID pParam) //线程函数

{
DWORD dwEvtMask ,dwResult;
tOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建一个事件
while (!IsWaitExit)
{
WaitCommEvent(((CGkbc8Dlg*)AfxGetMainWnd())->m_hCom,&dwEvtMask,&tOverLaped);//等待窗口事件
dwResult = WaitForSingleObject(tOverLaped.hEvent,100); //如果事件没有信号,延时0.1秒

switch (dwResult)
{
case WAIT_OBJECT_0: //事件对象有信号
switch (dwEvtMask)
{
case EV_RXCHAR: //接收到数据
{
if (IsStop)//发送停止
{
IsStop = FALSE;
//发送消息,由消息处理函数接收数据
:ostMessage(AfxGetMainWnd()->m_hWnd, CM_RECEIVE,0,(LPARAM)EV_RXCHAR);
}
break;
}
}
break;
}
}
return 0;
}
4 。自定义一用户消息#define CM_RECEIVE WM_USER+1//自定义一个消息,且手动添加映射此消息的处理函数OnRecieveData(),具体的操作可以看接下来的视频演示,最后是给主对话框添加一串口的句柄变量public:
HANDLE m_hCom; //串口句柄 ,用于对串口的设置,发送数据等操作。视频演示时用的是USB转RS232数据线,且将串口的接收发送端也就是2,3针短接,
实现自发自收效果,方便例程演示。

317上位机VC MFC利用控件实现串口RS232发送与接收数据

317上位机VC MFC利用控件实现串口RS232发送与接收数据

我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:316.上位机VC MFC实现串口RS232发送与接收数据.zip 
文件大小:131.86 KB  售价:11金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!







回复

使用道具 举报

大神点评(3)

点击查看
快速回复 返回列表 客服中心 搜索