c++ - linux将字符串值作为十六进制写入串行

标签 c++ linux string serial-port hex

这是我的问题
我有一个十六进制值的字符串,例如

std::string str ="8C000002008E"  

我想使用

将其写为十六进制以串行输出
write()

我有一个索尼显示器,我想用它来控制。
传递一个

unsigned char test[6] = {0x8c, 0x00, 0x00, 0x02, 0x00, 08E};

写入方法有效。 但我不知道如何将字符串转换为这样的字符数组,尤其是必须在运行时计算字符数组的大小。

感谢您的帮助。

这是我的完整代码

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <fcntl.h>
#include <termios.h>

#include <sstream>

using namespace std;
#define TERM_DEVICE "/dev/ttyUSB0"
#define TERM_SPEED "B9600"


int main() {

std::string teststr = "8C000002008E";

int fd, old_flags;

ssize_t length;

char buffer[16];

struct termios term_attr;

fd_set input_fdset;

if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
   {
    perror("terminal: Can't open device " TERM_DEVICE);
    return(1);
   }
            /* RS232 konfigurieren */
  if (tcgetattr(fd, &term_attr) != 0)
   {
    perror("terminal: tcgetattr() failed");
    return(1);
   }

  cfsetispeed(&term_attr, B9600);
  cfsetospeed(&term_attr, B9600);

  term_attr.c_cflag &= ~PARENB;

  term_attr.c_cflag &= CS8;
  term_attr.c_cflag &= CSIZE;
  term_attr.c_cflag &= CSTOPB;
  term_attr.c_iflag = 0;
  term_attr.c_oflag = OPOST | ONLCR;
  term_attr.c_lflag = 0;
  if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");

  if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
   {
    perror("terminal: tcgetattr() failed");
    return(1);
   }

  old_flags = term_attr.c_lflag;
  term_attr.c_lflag &= ~(ICANON | ECHO);
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");

  while (1)
   {
    FD_ZERO(&input_fdset);
    FD_SET(STDIN_FILENO, &input_fdset);
    FD_SET(fd, &input_fdset);

    if (select(fd+1, &input_fdset, NULL, NULL, NULL) == -1)
      perror("terminal: select() failed");


    unsigned char test[6] = {0x8c, 0x00, 0x00, 0x02, 0x00, 0x8E};

    if (FD_ISSET(STDIN_FILENO, &input_fdset)){
          if ((length = read(STDIN_FILENO, buffer, 16)) == -1)
            perror("terminal: read() failed");
          else
            if (buffer[0] == '\33')
                break;
        else{
              write(fd, test , sizeof(test));
        }
     }


    if (FD_ISSET(fd, &input_fdset))
     {
      if ((length = read(fd, buffer, 16)) == -1)
        perror("terminal: read() failed");
      else
          cout << std::hex << buffer<< endl;

     }
   }

  term_attr.c_lflag = old_flags;
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");

  printf("Aborted.\n");
  close(fd);

return 0;

}

最佳答案

如果问题只是将字符串转换为字符数组之一,您可以尝试以下操作:

#include <iostream>
#include <sstream>

int main(int argc, char **argv)
{
  const std::string str ="8C000002008E";

  // count the number of character pairs (i.e. bytes) in the string
  // and dynamically allocate an array of the required size
  const int numBytes = str.size() / 2;
  unsigned char* bytes = new unsigned char[numBytes];

  for (int i = 0; i < numBytes; ++i)
  {
    // grab two characters from the string...
    std::string twoChars = str.substr(2 * i, 2);

    // ...and convert them to an integer using a stringstream
    int byte;
    std::stringstream ss(twoChars);
    ss >> std::hex >> byte;

    // store the result in our char array
    bytes[i] = byte;
  }

  //
  // do something with the byte array here
  //

  // deallocate array before exiting
  delete[] bytes;
}

请注意,这假设初始字符串始终包含偶数个字符。处理奇数大小的输入字符串需要一些额外的代码。

关于c++ - linux将字符串值作为十六进制写入串行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654024/

相关文章:

c - linux上不解析/proc/cpuinfo获取CPU型号名称

java - FileWriter 未正确写入目录

Java `NumberFormat` 假定数字类型不正确

string - 如何将其转换为正确的字符串?

linux - 如何通过 idVendor 和 idProduct 获取 USB 设备路径?

c++ - 如何在 C++ 中定义接口(interface)?

c++ - 如何从 VirtualBox 日志文件中理解和调试?

c++ - 如何在 Linux 中将共享库转换为静态库

linux - 如何处理EPOLLERR和EPOLLHUP?

c++ - 多变量比较是否内联未定义行为?