⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~cpp

📁 简单的串口通讯程序适用于初学串口通讯的同学学习使用其中的基本api
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <algorithm> 
#include <iostream>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
String	m_disp;
HANDLE hCom;  //全局变量,串口句柄
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
    	hCom=CreateFile("COM1",//COM1口
		GENERIC_READ|GENERIC_WRITE, //允许读和写
		0, //独占方式
		NULL,
		OPEN_EXISTING, //打开而不是创建
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
		NULL);
	SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100

	COMMTIMEOUTS TimeOuts;
	//设定读超时
	TimeOuts.ReadIntervalTimeout=MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier=0;
	TimeOuts.ReadTotalTimeoutConstant=0;
	//在读一次输入缓冲区的内容后读操作就立即返回,
	//而不管是否读入了要求的字符。


	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier=100;
	TimeOuts.WriteTotalTimeoutConstant=500;
	SetCommTimeouts(hCom,&TimeOuts); //设置超时

	DCB dcb;
	GetCommState(hCom,&dcb);
	dcb.BaudRate=9600; //波特率为9600
	dcb.ByteSize=8; //每个字节有8位
	dcb.Parity=NOPARITY; //无奇偶校验位
	dcb.StopBits=0; //一个停止位
	SetCommState(hCom,&dcb);
        PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   	OVERLAPPED m_osWrite;
	memset(&m_osWrite,0,sizeof(OVERLAPPED));
	m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);


	char lpOutBuffer[100];
	memset(lpOutBuffer,'\0',100);
        int len;
        lpOutBuffer[0]='\x11';
        lpOutBuffer[1]='0';
	lpOutBuffer[2]='0';
	lpOutBuffer[3]='1';
	lpOutBuffer[4]='0';
	lpOutBuffer[5]='1';
        lpOutBuffer[6]='\x03';
	/*len=this->Memo1->Text.Length();
        lpOutBuffer[len]='\x03';
        for( int i=1;i<=len;i++)
        {
          lpOutBuffer[i-1]=this->Memo1->Text[i];
        } */
	DWORD dwBytesWrite=len;
	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 __fastcall TForm1::Button2Click(TObject *Sender)
{
    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);
    if((DWORD)ComStat.cbInQue<=dwBytesRead)
    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);
    this->Memo1->Text=str;
    //UpdateData(FALSE);
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -