串口通信 c语言 有结果Word文档下载推荐.docx
- 文档编号:21058446
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:230.05KB
串口通信 c语言 有结果Word文档下载推荐.docx
《串口通信 c语言 有结果Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《串口通信 c语言 有结果Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
returnFALSE;
/*系统初始化函数*/
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
HWNDhwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
ComboBox_InsertString(hwndCombo1,-1,TEXT("
COM1"
));
COM2"
COM3"
COM4"
COM5"
ComboBox_SetCurSel(hwndCombo1,0);
voidCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime);
SetTimer(hwnd,1,1000,TimerProc);
returnTRUE;
/*监视串口错误时使用的函数*/
boolProcessErrorMessage(char*ErrorText)
char*Temp=newchar[200];
LPVOIDlpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//Defaultlanguage
(LPTSTR)&
lpMsgBuf,
0,
NULL
);
sprintf(Temp,"
WARNING:
%sFailedwiththefollowingerror:
\n%s\nPort:
%d\n"
(char*)ErrorText,lpMsgBuf,"
com2"
MessageBox(NULL,Temp,"
ApplicationError"
MB_ICONSTOP);
LocalFree(lpMsgBuf);
delete[]Temp;
returntrue;
boolopenport(char*portname)//打开串口
hComm=CreateFile(portname,//串口号“com1”“com2”调用方法:
boolopen;
open=openport("
GENERIC_READ|GENERIC_WRITE,//允许读写
0,//通讯设备必须以独占方式打开
0,//无安全属性
OPEN_EXISTING,//通讯设备已存在
FILE_FLAG_OVERLAPPED,//异步I/O
0);
//通讯设备不能用模板打开
if(hComm==INVALID_HANDLE_VALUE)//如果被占用或是没有打开时返回的是这个错误代码
CloseHandle(hComm);
else
boolsetupdcb(intrate_arg)//设置port的属性
DCBdcb;
intrate=rate_arg;
memset(&
dcb,0,sizeof(dcb));
if(!
GetCommState(hComm,&
dcb))//获取当前DCB配置
//setDCBtoconfiguretheserialport
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate=rate;
dcb.Parity=NOPARITY;
//奇偶校验值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零
dcb.fParity=0;
//为1的话激活奇偶校验检查
dcb.StopBits=ONESTOPBIT;
//停止位个数,0~2分别对应1位、1.5位、2位停止位
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;
//setDCB
SetCommState(hComm,&
dcb))
returnfalse;
/*串口读取相关时间设置*/
boolsetuptimeout(DWORDReadInterval,DWORDReadTotalMultiplier,DWORDReadTotalconstant,DWORDWriteTotalMultiplier,DWORDWriteTotalconstant)
COMMTIMEOUTStimeouts;
timeouts.ReadIntervalTimeout=ReadInterval;
//读取两个字节间隔最大值mS如超过立即返回不再读取
timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;
//如果同下面一个都为0则无论是否读到数据都返回
//可以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间
timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;
//以毫秒为单位指定一个常数,用于计算读操作的总限时时间0表示不限时
timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;
//写操作延时同上
timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
SetCommTimeouts(hComm,&
timeouts))
intClearn()//清除buff中的内容并返回buff中现有数据量的大小并读取错误原因
DWORDdwError=0;
DWORDBytesRead=0;
ClearCommError(hComm,&
dwError,&
comstat);
returncomstat.cbInQue;
//返回buff中数据量
/*串口数据接收读取函数*/
voidReceiveChar()
BOOLbRead=TRUE;
BOOLbResult=TRUE;
chari=0,n;
charRXBuff;
j=0;
while(i-n)
n=i;
Sleep(10);
bResult=ClearCommError(hComm,&
i=(char)comstat.cbInQue;
}
for(;
i>
0;
i--)
if(bRead)
bResult=ReadFile(hComm,//HandletoCOMMport
&
RXBuff,//RXBufferPointer
1,//Readonebyte
BytesRead,//Storesnumberofbytesread
m_ov);
//pointertothem_ovstructure
//printf("
%c"
RXBuff);
cRecs[j++]=(char)RXBuff;
if(!
bResult)
switch(dwError=GetLastError())
caseERROR_IO_PENDING:
bRead=FALSE;
break;
default:
break;
bRead=TRUE;
//closeif(bRead)
bRead)
bResult=GetOverlappedResult(hComm,//HandletoCOMMport
m_ov,//Overlappedstructure
TRUE);
//Waitflag
boolWriteChar(char*m_szWriteBuffer,DWORDm_nToSend)//写字符的函数
BOOLbWrite=TRUE;
DWORDBytesSent=0;
HANDLEm_hWriteEvent;
ResetEvent(m_hWriteEvent);
if(bWrite)
m_ov.Offset=0;
m_ov.OffsetHigh=0;
//Clearbuffer
bResult=WriteFile(hComm,//HandletoCOMMPort
m_szWriteBuffer,//Pointertomessagebufferincallingfinction
m_nToSend,//Lengthofmessagetosend
BytesSent,//Wheretostorethenumberofbytessent
m_ov);
//Overlappedstructure
DWORDdwError=GetLastError();
switch(dwError)
//continuetoGetOverlappedResults()
BytesSent=0;
bWrite=FALSE;
//allothererrorcodes
}//endif(bWrite)
bWrite)
bWrite=TRUE;
BytesSent,//Storesnumberofbytessent
//dealwiththeerrorcode
printf("
GetOverlappedResults()inWriteFile()"
}//endif(!
//Verifythatthedatasizesendequalswhatwetriedtosend
if(BytesSent!
=m_nToSend)
WriteFile()error..BytesSent:
%d;
MessageLength:
BytesSent,strlen((char*)m_szWriteBuffer));
/*window时间函数回调*/
voidCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime)
SYSTEMTIMEtime;
//定义机构体变量time
GetLocalTime(&
time);
//取系统时间以指针方式
TCHARstrTime[256];
//程序只有一个作用
wsprintf(strTime,"
%04d-%02d-%02d%02d:
%02d:
%02d"
time.wYear,//就是读取系统时间
time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
//然后写进strTime
SetDlgItemText(hwnd,IDC_TIME,strTime);
//这个字符串
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
switch(id)
caseIDC_SEND:
GetDlgItemText(hwnd,IDC_EDIT2,cSends,sizeof(cSends));
unsignedn=sizeof(cSends);
//n是通知串口将发送字节的长度
charsend[100];
wsprintf(send,"
%s"
cSends);
WriteChar(send,n-1);
SetCommMask(hComm,EV_RXCHAR);
//监视串口是否接收有数据
ReceiveChar();
//读取串口sbuff中数据
cRecs[j]='
\0'
;
//将cRecs转为字符串
SetDlgItemText(hwnd,IDC_EDIT1,cRecs);
}break;
/*
caseIDC_RECEIVE:
//暂时未用采用直接显示的方式
*/
caseIDC_CHECK:
intctr;
ctr=ComboBox_GetCurSel(hwndCombo1);
switch(ctr)
case0:
cCom="
com1"
case1:
case2:
com3"
case3:
com4"
case4:
com5"
cCom="
if(openport(cCom))
{SetDlgItemText(hwnd,IDC_EDIT3,"
OK!
"
MessageBox(hwnd,"
串口打开成功!
"
0);
}
SetDlgItemText(hwnd,IDC_EDIT3,"
FAIL"
if(setupdcb(9600)&
setuptimeout(1024,0,0,20,1000))//初始化串口属性波特率9600
SetDlgItemText(hwnd,IDC_EDIT4,"
串口属性设置成功"
串口初始化失败!
PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
voidMain_OnClose(HWNDhwnd)
EndDialog(hwnd,0);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口通信 c语言 有结果 串口 通信 语言 结果