串口通信问题

三岁、就很帅 2011-03-11 11:04:24
怎么通过串口发送数据 然后接受底下单板机给我回的数据 求思路
这个是我打开串口的程序

hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

//COM1
//允许读写
// 0 独占方式
//OPEN_EXISTING打开而不是创建
//同步方式

if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败");

return FALSE;
}
GetDlgItem(IDC_DISP)->SetWindowText(" 正在发送测试端口标志请等待……");

SetTimer(10,2000,NULL);

SetTimer(11,2000,NULL);
//GetDlgItem(IDC_DISP)->SetWindowText("端口已找到");


//在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。
//这需要通过一个DCB结构来进行。
//DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。
//在查询或配置串口的属性时,都要用DCB结构来作为缓冲区
//一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置
//要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口。

SetupComm(hCom,100,100);//输入缓冲区和输出缓冲区的大小都是100
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作

TimeOuts.ReadTotalTimeoutMultiplier=0;//读时间系数
TimeOuts.ReadTotalTimeoutConstant=0;//读时间常量


//在读一次输入缓冲区的内容后读操作就立刻返回
//而不管是否读入了要求的字符


//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100; //总超时=时间系数*要求读/写的字符数+时间常量

TimeOuts.WriteTotalTimeoutConstant=500; //设置写超时以指定WriteComm成员函数中的

SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY; //无奇偶校验
dcb.StopBits=TWOSTOPBITS; //2个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
...全文
112 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyx100 2011-03-15
  • 打赏
  • 举报
回复
发送数据就在主线程中发就可以了,至于接收数据的话,就要看你的通信需求。一般新创建一个线程来接收数据,在利用回调函数来显示。

ok1234567 2011-03-15
  • 打赏
  • 举报
回复
推荐:CnComm,一个不错的封装类
http://blog.csdn.net/wujian53
lin912703942 2011-03-15
  • 打赏
  • 举报
回复
下载个别人写的串口类,搜索SerialPort串口,网上有很多。
随行的太阳 2011-03-15
  • 打赏
  • 举报
回复
我用的是第三方控件。可以在网上找找。
用控件比较简单。。。。。给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
给力。
youhao1999 2011-03-15
  • 打赏
  • 举报
回复
只在主线程里就可以了吧
三岁、就很帅 2011-03-14
  • 打赏
  • 举报
回复
三岁、就很帅 2011-03-11
  • 打赏
  • 举报
回复
创建线程还没用过 - - 我是菜鸟
sxqinge 2011-03-11
  • 打赏
  • 举报
回复
创建个线程来进行数据的发送和接受
三岁、就很帅 2011-03-11
  • 打赏
  • 举报
回复
void CMyDlg::OnSend() 
{
//MessageWindow 提供发送和接受基于window的消息能力
//若要在程序中使用 MessageWindow,您需要创建一个从 MessageWindow 派生的类,
//并重写默认的 WndProc 行为来监视特定的窗口消息。可以使用 Message 类生成消息。
//可以只接收您使用 MessageWindow 生成的或由本机控件生成的基于 Windows 的消息。


// TODO: Add your control notification handler code here
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);





char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7);
lpOutBuffer[0]='\x11';
lpOutBuffer[1]='0';
lpOutBuffer[2]='0';
lpOutBuffer[3]='1';
lpOutBuffer[4]='0';
lpOutBuffer[5]='1';
lpOutBuffer[6]='\x03';


DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,&m_osWrite);

if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}
}



void CMyDlg::OnReceive() //接收
{

// TODO: Add your control notification handler code here
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

COMSTAT ComStat;
DWORD dwErrorFlags;

char str[100];
memset(str,'\0',100);

DWORD dwBytesRead=100;//读取的字节数

BOOL bReadStat;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);

bReadStat=ReadFile(hCom,str,

dwBytesRead,&dwBytesRead,&m_osRead);

if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}

PurgeComm(hCom, PURGE_TXABORT|

PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);

}

这个没看懂
hthgc1987 2011-03-11
  • 打赏
  • 举报
回复
发送数据就在主线程中发就可以了,至于接收数据的话,就要看你的通信需求。一般新创建一个线程来接收数据,在利用回调函数来显示。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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