您的位置:首页 > 编程语言

windows 串口编程例子

2012-04-20 14:16 302 查看
此文版权属于作者

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

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: