我做了一个串口通讯的程序。我要求点击按钮以后串口打开,再次点击按钮以后串口关闭。请问该加入什么功能呢?怎么实现呢?我的源程序如下:void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Caption="串口打开";
char *ComNo;
DCB dcb;
String Temp;
//取得要打开的通信端口
Temp = "COM"+IntToStr(rdCOM->ItemIndex +1);
//转换至指针类型Char
ComNo = Temp.c_str();
hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, 0);
if (hComm == INVALID_HANDLE_VALUE) // 如果通信端口未打开
{
MessageBox(0, "打开通信端口错误!!","Comm Error",MB_OK);
return;
}
//将dcb地址传入,以取得通信参数
GetCommState(hComm,&dcb); // 得知目前通信端口的状态
dcb.BaudRate = CBR_19200; // 设置波特率为9600
dcb.ByteSize = 8; // 字节为 8 bit
dcb.Parity = NOPARITY; // Parity 为 None
dcb.StopBits = ONESTOPBIT; // 1 个Stop bit
//通信端口设置
if (!SetCommState(hComm, &dcb)) { // 设置通信端口的状态
MessageBox (0, "通信端口设置错误!!!","Set Error",MB_OK);
CloseHandle(hComm);
return;
}
}
CreateFile 的那一句有问题。
当你第二次按那个按钮的时候,因为指定的串口已经打开,
所以这个函数无法创建 hComm。
唯一的办法是把 hComm 定义成静态变量。
然后在 CreateFile 之前判断串口是否已经打开:
if(hComm == NULL)
{
hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, 0);
//以下的就自己完成了
Button1->Caption="关闭串口";
}
else
{
CloseHandle(hComm);
hComm = NULL;
Button1->Caption="打开串口";
}
大概就是这样了。