我vc里写了一个串口通讯的小程序,实现向串口写6个字符'h','e','l','l','o','!'我把所有代码放在WinMain函数里可以成功写入串口,但我把初始化串口的一段程序封装到函数里实现时,却不成功,下面是两种方式的代码:1,直接在WinMain函数中写,成功:
#include<windows.h>int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR pCmdLine,int iCmdShow)
{
HANDLE hComm;
DCB dcb;
COMMTIMEOUTS timeouts; hComm=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
SetupComm(hComm,1024,1024);
timeouts.ReadIntervalTimeout=1000;
timeouts.ReadTotalTimeoutMultiplier=500;
timeouts.ReadTotalTimeoutConstant=5000;
timeouts.WriteTotalTimeoutMultiplier=500;
timeouts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hComm,&timeouts);
GetCommState(hComm,&dcb);
dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=EVENPARITY;
dcb.StopBits=ONESTOPBIT;
SetCommState(hComm,&dcb); char t_buffer[64]={'h','e','l','l','o','!'};
DWORD dwBytesWritten;
for(int i=0;i<64;i++)
{
WriteFile(hComm,t_buffer,1,&dwBytesWritten,NULL);
Sleep(10);
}
MessageBox(0,"File Write OK!","Comm",0);
}
2.我把初始化串口的过程放入函数,失败了:
#include <windows.h>void OpenComm(HANDLE);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR pCmdLine,int iCmdShow)
{
HANDLE hComm=NULL; OpenComm(hComm); char t_buffer[6]={'h','e','l','l','o','!'};
DWORD dwBytesWritten;
for(int i=0;i<6;i++)
{
WriteFile(hComm,t_buffer+i,1,&dwBytesWritten,NULL);
Sleep(10);
}
MessageBox(0,"File Write OK!","Comm",0); return 0;
}void OpenComm(HANDLE hComm)
{
DCB dcb;
COMMTIMEOUTS timeouts; hComm=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
SetupComm(hComm,1024,1024);
timeouts.ReadIntervalTimeout=1000;
timeouts.ReadTotalTimeoutMultiplier=500;
timeouts.ReadTotalTimeoutConstant=5000;
timeouts.WriteTotalTimeoutMultiplier=500;
timeouts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hComm,&timeouts);
GetCommState(hComm,&dcb);
dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=EVENPARITY;
dcb.StopBits=ONESTOPBIT;
SetCommState(hComm,&dcb);
}

解决方案 »

  1.   

    void OpenComm(HANDLE &);void OpenComm(HANDLE &hComm)
    {
    ...
    }
      

  2.   

    这样不行的,你有三个方案:
    (1)在外边Create,在函数内配置;
    (2)让OpenComm从返回值返回这个新建的HANDLE,即:HANDLE OpenComm();
    (3)把OpenComm的参数改成引用类型,即:void OpenComm(HANDLE& handle);除了C++中引用类型的参数之外,C/C++中所有的参数参数传递都是传值的,所以在函数内部对HANDLE的任何赋值行为对函数外边没有影响。
    之所以我说可以先在外边创建,面里边配置,并不是说这样就不是传值了,而是说这样就不会需要在函数内对那个参数有“赋值”的动作了,都是些配置而已。