用vs2010 c++编写收银机开钱箱

来源:互联网 发布:网络机顶盒恢复出厂 编辑:程序博客网 时间:2024/04/27 07:46
1.环境 Windows7 vs2010
2.语言 c++
3.设备 钱箱与打印机的LPT1口相连
4.控制指令  27 112 7(十进制)
5.代码

点击(此处)折叠或打开

  1. CString sPort;
  2.     //sPort.Format(_T("\\\\.\\LPT1"));//两种方法都行
  3.     sPort.Format(_T("LPT1"));
  4. #if 1
  5.     //设置为重叠 异步IO
  6.     HANDLE hPort = CreateFile(sPort,GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);//创建文件
  7.     if (hPort == INVALID_HANDLE_VALUE || hPort == (HANDLE)ERROR_INVALID_HANDLE)
  8.     {
  9.         CString lsreturn = L"open fail";
  10.         ExecutePrint(rect,LogFont,pDC,lsreturn.GetBuffer(0),lsreturn.GetLength(),DT_CENTER | DT_BOTTOM | DT_SINGLELINE);
  11.         return false;
  12.     }
  13.     char lco[4];
  14.     
  15.     lco[0] = 27;
  16.     lco[1] = 112;
  17.     lco[2] = 7;
  18.     lco[3] = '\0';

  19.     DWORD writebyte = 0;
  20.     DWORD writecount = 4;

  21.     OVERLAPPED* pOverlapped = new OVERLAPPED;
  22.     ZeroMemory(pOverlapped, sizeof(OVERLAPPED));
  23.     pOverlapped->Offset = 0;
  24.     pOverlapped->OffsetHigh = 0;
  25.     pOverlapped->hEvent = 0;
  26.     //pOverlapped->hEvent = (HANDLE) this;
  27.     int lret = 0;
  28.     lret = WriteFile(hPort,lco,writecount,&writebyte,pOverlapped);//向文件中直接写命令
  29.     if (lret == 0)
  30.     {
  31.         int err = GetLastError();
  32.         if (GetLastError() == ERROR_IO_PENDING)//重叠IO进行中
  33.         {
  34.             GetOverlappedResult(hPort,pOverlapped,&writebyte,true);
  35.         }
  36.         else//其他的错误
  37.         {
  38.             delete pOverlapped;
  39.             CloseHandle(hPort);
  40.             CString lsreturn = L"Failed to write";
  41.             ExecutePrint(rect,LogFont,pDC,lsreturn.GetBuffer(0),lsreturn.GetLength(),DT_CENTER | DT_BOTTOM | DT_SINGLELINE);
  42.             return false;
  43.         }
  44.     }
  45. #endif

  46. #if 0
  47.     //同步IO 2种方法都可以
  48.     HANDLE hPort = CreateFile(sPort,GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, 0, NULL);
  49.     if (hPort == INVALID_HANDLE_VALUE || hPort == (HANDLE)ERROR_INVALID_HANDLE)
  50.     {
  51.         CString lsreturn = L"open fail";
  52.         ExecutePrint(rect,LogFont,pDC,lsreturn.GetBuffer(0),lsreturn.GetLength(),DT_CENTER | DT_BOTTOM | DT_SINGLELINE);
  53.         return false;
  54.     }
  55.     char lco[4];
  56.     lco[0] = 27;
  57.     lco[1] = 112;
  58.     lco[2] = 7;
  59.     lco[3] = '\0';

  60.     DWORD writebyte = 0;
  61.     DWORD writecount = 4;
  62.     int lret = 0;
  63.     lret = WriteFile(hPort,lco,writecount,&writebyte,NULL);
  64.     if (lret == 0)
  65.     {
  66.         int err = GetLastError();
  67.         CloseHandle(hPort);
  68.         CString lsreturn = L"Failed to write";
  69.         ExecutePrint(rect,LogFont,pDC,lsreturn.GetBuffer(0),lsreturn.GetLength(),DT_CENTER | DT_BOTTOM | DT_SINGLELINE);
  70.         return false;
  71.     }
  72. #endif
  73.     CloseHandle(hPort);

打开LPT1文件
向文件中写入命令
关闭文件

另外,在网上还查到一些别的指令,如 27 112 0 60 225(十进制的)。但是中间的那个0会被看成空字符,指令会被截断,不知道用什么方法解决。
阅读(72) | 评论(0) | 转发(0) |
0

上一篇:大话设计模式源码

下一篇:sprintf你知道多少

相关热门文章
  • VS2010 运行时找不到DLL
  • VS2010 查看DLL接口
  • VS2010 预编译头文件来自编译...
  • VS2010 Windows制作DLL
  • VS2010 fatal error LNK1123: ...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 一个简单的shell脚本问题...
  • 网站如何做图片的防盗链功能呢...
  • 如何将printf输出的字符(含有...
  • 嵌入式linux wifi移植 libert...
  • Ø ⊆ {Ø} 是否是对的 ,这么...
给主人留下些什么吧!~~