新手写的驱动源码,请大家看是否正确!

zcwell   2007-2-14 12:35 楼主
新手写的wince下的串口驱动,请大家看看驱动的框架是否是这样写,在XXX_Init()中的代码是否正确,是不是在在这里使用createfile()
有关程序逻辑的错误可先不讨论

#include
#include
#include
#include

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
    switch ( ul_reason_for_call )
        {
                case DLL_PROCESS_ATTACH:        
                         DEBUGMSG(1, (TEXT( "DLL_PROCESS_ATTACH\r\n" )) );
                        break;
                case DLL_PROCESS_DETACH:
                        DEBUGMSG(1, (TEXT( "DLL_PROCESS_DETACH\r\n" )) );
                        break;
                case DLL_THREAD_ATTACH:
                        DEBUGMSG(1, (TEXT( "DLL_THREAD_ATTACH\r\n" )) );
                        break;
                case DLL_THREAD_DETACH:
                        DEBUGMSG(1, (TEXT( "DLL_THREAD_DETACH\r\n" )) );
                        break;
        }
    DEBUGMSG(1, (TEXT( "Go DllMain\r\n" )) );
        return TRUE;
}
extern "C" __declspec(dllexport)
DWORD SCA_Init(DWORD dwContext,LPCVOID lpvBusContext)
{

        //  MessageBox(NULL,TEXT("初始化SCA_Init"),TEXT("初始化SCA_Init"),0);
          //1.打开指定串口
          HANDLE hComm;
          hComm = CreateFile(_T("COM1:"),      // 串口名称(COMx)
                   GENERIC_READ | GENERIC_WRITE,         // 串口属性为可读/写
                   0,                                                                        // 串口设备必须被独占性的访问
                   NULL,                                                               // 无安全属性
                   OPEN_EXISTING,                                          // 串口设备必须使用OPEN_EXISTING参数
                   FILE_ATTRIBUTE_NORMAL,                    // 同步式 I/O
                  0);                                                                      // 对于串口设备而言此参数必须为0
                                 
          if (hComm == INVALID_HANDLE_VALUE)

         {
                   return 0;

         }

          //2.设置串口参数:波特率、数据位、校验位、停止位等信息
         DCB dcb;
         GetCommState(hComm, &dcb);    //获取该端口的默认参数
         //修改波特率
         dcb.BaudRate = 115200;
                 dcb.fBinary=0;
         //重新设置参数
         SetCommState(hComm, &dcb);
                 SetupComm(hComm,//通信设备句柄DWORD
                               1024,//输入缓冲区大小DWORD
                                   1024//输出缓冲区大小
                                   );

                 
                // _beginthread( CheckKey, 0, NULL );

                  BYTE   Byte;
                  int    iCounter = 0;
                  DWORD   dwBytes;
                  char    ReceiveBuf[1000];  ///缓冲区的大小  
                  SetCommMask(hComm, EV_RXCHAR); ///只接收字符
                  while(hComm != INVALID_HANDLE_VALUE)
                  {
                        DWORD dwCommStatus;
                        WaitCommEvent(hComm, &dwCommStatus, 0);
                        SetCommMask(hComm, EV_RXCHAR); ///重新设置要等待的信号
                        // 接收数据
                        do
                        {
                                ReadFile(hComm,&Byte,1,&dwBytes,0);
                                if(dwBytes==1)
                                {
                                        keybd_event(int(Byte), 0, 0, 0); //VK_F1
                                        keybd_event(int(Byte), 0, KEYEVENTF_KEYUP, 0 );
                                        ReceiveBuf[iCounter++]=Byte;
                                        if(iCounter==1000)
                                        {
                                                break;
                                        }
                                }
                        }while(dwBytes==1);
        
                  }
             return 1;
  
}

extern "C" __declspec(dllexport)
BOOL SCA_Deinit(DWORD hDeviceContext)
{
         BOOL bReturn = TRUE;
         return bReturn;
}

extern "C" __declspec(dllexport)
DWORD SCA_Open(DWORD hDeviceContext,
                                DWORD AccessCode,
                                DWORD ShareMode)
{
         DWORD dwReturn=0;
         return dwReturn;
}

extern "C" __declspec(dllexport)
  BOOL SCA_CLOSE(DWORD hOpenContext)
{
         BOOL bReturn=TRUE;
         if(hComm != NULL)
         {
                CloseHandle(hComm);
                hComm = NULL;
         }
         return bReturn;
}

extern "C" __declspec(dllexport)
  BOOL SCA_IOControl(DWORD hOpenContext,
                                         DWORD dwCode,
                                         PBYTE pBufIn,
                                         DWORD dwLenIn,
                                         PBYTE pBufOut,
                                         DWORD dwLenOut,
                                         PDWORD pdwActualOut
                                        )
{
         BOOL bReturn=TRUE;
         return bReturn;
}

extern "C" __declspec(dllexport)
void SCA_PowerDown(DWORD hDeviceContext)
{
        
}

extern "C" __declspec(dllexport)
void SCA_PowerUp(DWORD hDeviceContext)
{
}

extern "C" __declspec(dllexport)
DWORD SCA_Read(DWORD hOpenContext,
                                LPVOID pBuffer,
                                DWORD Count
                                )
{
         return 1;
}

extern "C" __declspec(dllexport)
DWORD SCA_Seek(DWORD hOpenContext,
                                LONG Amount,
                                DWORD Type
                                )
{

         return 0;
}

extern "C" __declspec(dllexport)
DWORD SCA_Write(DWORD hOpenContext,
                                LPVOID pSourceBytes,
                                DWORD NumberOfBytes
                                )
{
         
         return 0;
}

回复评论 (6)

这根本就不叫驱动程序
点赞  2007-3-6 15:13
只是一个动态库呀,哪里表现出驱动的概念了?
点赞  2007-3-7 09:56
你的DLL应该是有没有什么大问题的,如果WINCE中串口是个标准设备,那么,应该是可以直接CreateFile的。

但,如果WINCE并不支持串口设备(SORRY,我对WINCE不了解),那你这样是无法得到设备句柄的。

如果要写驱动,只怕你这些API都是无效的了,应该使用的是内核API
点赞  2007-3-7 09:59
点赞  2007-3-9 13:41
老大,就沒有發現DriverEntry啊
点赞  2007-3-9 16:48
应该就是这样的吧,windows驱动程序才需要DriverEntry作为程序入口点,winCE驱动其实就是一个动态库
点赞  2007-3-25 00:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复