windows 串口编程例子

来源:互联网 发布:苏芬战争 知乎 编辑:程序博客网 时间:2024/05/01 17:35

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!

 今天需要测试一些串口设备,写了一个简单例子,贴到这里,做个备忘。

HANDLE dev;char buf[1024];BOOL set_opt_1(){  printf("%s\n", __FUNCTION__);  DCB dcb;  SecureZeroMemory(&dcb, sizeof(DCB));  dcb.DCBlength = sizeof(DCB);  GetCommState(dev, &dcb);  dcb.BaudRate = CBR_300;  dcb.ByteSize = 7;  dcb.Parity = EVENPARITY;  dcb.StopBits = ONESTOPBIT;  return SetCommState(dev, &dcb);}BOOL set_opt_2(){  printf("%s\n", __FUNCTION__);  DCB dcb;  SecureZeroMemory(&dcb, sizeof(DCB));  dcb.DCBlength = sizeof(DCB);  GetCommState(dev, &dcb);  dcb.BaudRate = CBR_9600;  dcb.ByteSize = 8;  dcb.Parity = NOPARITY;  dcb.StopBits = ONESTOPBIT;  return SetCommState(dev, &dcb);}BOOL send_req(void const* buf, DWORD size){  printf("%s\n", __FUNCTION__);  DWORD bytes_written = 0;  return WriteFile(dev, buf, size, &bytes_written, NULL);}BOOL send_req(char const* str){  return send_req(str, (DWORD)strlen(str));}BOOL read_until(char const* delims){  DWORD bytes_read = 0;  DWORD cur_read = 0;  for (;;)  {    if (!ReadFile(dev, buf + bytes_read, 1, &cur_read, NULL))      return FALSE;    if (buf[bytes_read] == 0)      continue;    printf("%02X ", (unsigned char)buf[bytes_read]);    bytes_read += cur_read;    buf[bytes_read] = 0;    if (strstr(buf, delims))    {      printf("\n");      return TRUE;    }    else if (bytes_read >= sizeof(buf) - 1)    {      printf("\n");      return FALSE;    }  }}BOOL read_line(){  printf("%s\n", __FUNCTION__);  return read_until("\r\n");}BOOL read_some(){  printf("%s\n", __FUNCTION__);  DWORD bytes_read = 0;  DWORD cur_read = 0;  do  {    if (!ReadFile(dev, buf + bytes_read, 1, &cur_read, NULL))      return FALSE;    printf("%02X ", (unsigned char)buf[bytes_read]);    bytes_read += cur_read;  }while(bytes_read < sizeof(buf));  printf("\n");  return TRUE;}void close_dev(){  CloseHandle(dev);}void open_dev(){  dev = CreateFile("\\\\.\\COM7", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);}BOOL clear_error(){  DWORD err;  COMSTAT stat;  return ClearCommError(dev, &err, &stat);}int main(int, char*[]){  open_dev();  if (dev == INVALID_HANDLE_VALUE)    return 1;  for (;;)  {    if (!set_opt_1()) break;    if (!send_req("/?!\r\n")) break;    if (!read_line()) break;    {      BYTE req[] = {0x06, 0x32, 0x35, 0x32, 0x0D, 0x0A};      if (!send_req(req, sizeof(req))) break;    }    Sleep(500);    if (!set_opt_2()) break;    {      BYTE req[] = {0x7E, 0xA0, 0x07, 0x03, 0x21, 0x93, 0x0F, 0x01, 0x7E};      if (!send_req(req, sizeof(req))) break;    }    if (!read_line()) break;    if (!read_some()) break;    break;  }  CloseHandle(dev);  return 0;}

 

 

原创粉丝点击