📄 串口通信的api方法.txt
字号:
HANDLE hCom;
char buf[100];
unsigned char msg1[100];
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
void CApicomDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case 1: {
Onsend();
break;
}
case 2: {
Onread();
break;
}
}
CDialog::OnTimer(nIDEvent);
}
unsigned short CApicomDlg::Getcmd_CRC(unsigned char *cmdbuf,int cmdlen)
{
unsigned short crcreg,crcbuf;
int i,j;
crcreg=0xffff;
for(i=1;i<cmdlen;i++){
crcreg=crcreg^cmdbuf[i];
for(j=0;j<8;j++){
crcbuf=crcreg;
crcreg>>=1;
if(crcbuf&0x01)
crcreg^=0xa001;
}
}
return crcreg;
}
void CApicomDlg::Oninit() //初始化串口
{
// TODO: Add your control notification handler code here
UpdateData (true);
unsigned char check_code=0;
DCB dcb;
int kk;
COMMTIMEOUTS comtimeout;
char szPort[100];
tong=0;
butong=-1;
wsprintf( szPort, "COM%d", m_comsel+1 );
strcpy ((char *)msg1,m_senddata);//"@01RD17");
kk=strlen (m_senddata);
//*(unsigned short *)&msg1[kk]=Getcmd_CRC(msg1,kk);
check_code=msg1[1];
for (int i=2;i<kk;i++)
check_code=check_code^msg1[i];
if ((check_code&0x0f)>=0x0a)
msg1[kk+1]=(check_code&0x0f)+0x37;
else msg1[kk+1]=(check_code&0x0f)+0x30;
if (((check_code>>4)&0x0f)>=0x0a)
msg1[kk]=((check_code>>4)&0x0f)+0x37;
else msg1[kk]=((check_code>>4)&0x0f)+0x30;
msg1[kk+2]=0x0D;
if (hCom)
{
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( hCom);
hCom= NULL;
Sleep (10);
}
hCom=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
if( hCom == INVALID_HANDLE_VALUE)
{
AfxMessageBox ("初始化不成功!");
return ;
}
ZeroMemory(&dcb,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
kk=GetCommState(hCom,&dcb);
dcb.BaudRate= m_baudrate;
dcb.ByteSize=m_databit;
dcb.fParity=1;
dcb.Parity=m_parity;
dcb.StopBits=m_stopbit;
dcb.XoffChar=0x00;
kk=SetCommState(hCom,&dcb);
kk=GetCommTimeouts(hCom,&comtimeout);
comtimeout.ReadIntervalTimeout =1;
kk=SetCommTimeouts(hCom,&comtimeout);
kk=SetupComm(hCom,512,512);//设置缓冲区大小
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if (m_stime)
SetTimer(1,m_stime,NULL);
}
void CApicomDlg::Onsend() //发送字符串函数
{
DWORD ByteCount=400;
unsigned char check_code=0;
int kk;
COMSTAT ComStat;
DWORD dwErrorFlages;
UpdateData (true);
strcpy ((char *)msg1,m_senddata);//"@01RD17");
kk=strlen (m_senddata);
msg1[2]=(((msg1[2]-48)%4)+49);
m_senddata=msg1;
check_code=msg1[1]; //求校验码
for (int i=2;i<kk;i++)
check_code=check_code^msg1[i];
if ((check_code&0x0f)>=0x0a)
msg1[kk+1]=(check_code&0x0f)+0x37;
else msg1[kk+1]=(check_code&0x0f)+0x30;
if (((check_code>>4)&0x0f)>=0x0a)
msg1[kk]=((check_code>>4)&0x0f)+0x37;
else msg1[kk]=((check_code>>4)&0x0f)+0x30;
msg1[kk+2]=0x0D;
kk=strlen ((char *)msg1);
ClearCommError(hCom,&dwErrorFlages,&ComStat);
WriteFile(hCom,msg1,kk,&ByteCount,&m_OverlappedWrite );//写文件发送
if (m_rtime)
SetTimer(2,m_rtime,NULL);
if (m_stime)
SetTimer(1,m_stime,NULL);
}
void CApicomDlg::Onread() //接收字符串函数
{
KillTimer( 2 );
ZeroMemory(buf,sizeof(buf));
unsigned long length=1;
int RLength,i;
COMSTAT ComStat;
DWORD dwErrorFlages;
CClientDC dc (this);
char tempch[10];
int flag=0;
int temp=0;
do {
flag++;
ClearCommError(hCom,&dwErrorFlages,&ComStat);
RLength=ComStat.cbInQue;
if(RLength>0)
{
for (i=0;i<RLength;i++)//以重叠方式接收指定字符,函数立即返回
{
ReadFile(hCom,&buf[temp],length,&length,&m_OverlappedRead);
if ((buf[temp]==0x0d)||((temp>=5)&&(buf[temp]==0x00)))
{
//for (i=0;i<90;i++)
// buf[i]=buf[i+1];
char buff[4];
for (i= 0 ;i<2;i++)
{
if (buf[9+i]>0x39)
buff[i] = buf[9+i]-0x37;
else buff[i] = buf[9+i]-0x30;
}
for (i= 0 ;i<2;i++)
{
if (buf[7+i]>0x39)
buff[2+i] = buf[7+i]-0x37;
else buff[2+i] = buf[7+i]-0x30;
}
if (buf[2]==49)
m_data=CS16toint(buff);
else if (buf[2]==50)
m_data2=CS16toint(buff);
else if (buf[2]==51)
m_data3=CS16toint(buff);
else if (buf[2]==52)
m_data4=CS16toint(buff);
else
butong++;
m_readdata=buf;
UpdateData (FALSE);
return;
}
else temp++;
}
}
}
while (flag<20);
}
void CApicomDlg::Onpause() //暂停通讯
{
// TODO: Add your control notification handler code here
KillTimer( 1 );
KillTimer( 2 );
if (hCom)
{
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( hCom);
hCom= NULL;
}
}
float CApicomDlg::CS16toint(char *buff) //十六进制转十进制
{
int disp_v=1;
int i=0;
signed short int disp_v1;
disp_v1 = buff[0]*0x1000+ \
buff[1]*0x100 + \
buff[2]*0x10 + \
buff[3];
float disp=disp_v1;
for (i=0;i<buf[12]-48;i++)
disp_v =disp_v*10;
return disp/disp_v;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -