C++:invalid conversion from 'unsigned char *' to 'const char *'

來源:互聯網
上載者:User

標籤:cloc   version   ini   read   method   指標   console   test   val   

最近使用node的串口庫發現很慢,自己用c++寫了個驅動使用node去調用它並測試通過,速度也很快,最初版本記錄下:

test.js

var test = require(‘./build/Release/test‘);test.ArduinoDevice(‘test‘, function(data) {  console.log(data);});

 

gyp配置:

{  "targets": [    {      "target_name": "test",      "sources": [ "test.cc"]    }  ]}

test.cc

#include <node.h>#include <v8.h>#include <stdio.h>#include <unistd.h>         //Used for UART#include <fcntl.h>          //Used for UART#include <termios.h>        //Used for UART#include <string.h>using namespace v8;// 傳入了兩個參數,args[0] 字串,args[1] 回呼函數void hello(const FunctionCallbackInfo<Value>& args) {  // 使用 HandleScope 來管理生命週期  Isolate* isolate = Isolate::GetCurrent();  HandleScope scope(isolate);  ///////////////////////////////////////////////////////////////////  int uart0 = -1;  printf("----------starting-------------------\n");  uart0 = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);      //Open in non blocking read/write mode  if (uart0 == -1)  {      printf("Error - Unable to open UART.  Ensure it is not in use by another application\n");  }  struct termios options;  tcgetattr(uart0, &options);  options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;  options.c_iflag = IGNPAR;  options.c_oflag = 0;  options.c_lflag = 0;  tcflush(uart0, TCIFLUSH);  tcsetattr(uart0, TCSANOW, &options);  //----- TX BYTES -----  unsigned char tx_buffer[20];  unsigned char *p_tx_buffer;  unsigned char *p_tx_buffer2;  unsigned char str[] = "closel\0";  // p_tx_buffer = &tx_buffer[0];  // *p_tx_buffer++ = ‘o‘;  // *p_tx_buffer++ = ‘p‘;  // *p_tx_buffer++ = ‘e‘;  // *p_tx_buffer++ = ‘n‘;  // *p_tx_buffer++ = ‘l‘;  printf("--1--\n");  p_tx_buffer2 = &tx_buffer[0];  printf("--then str is %s and strlen is %d--\n",(const char*)str,strlen((const char*)str));  //printf("%s",strlen(str));  for(int i=0;i<strlen(reinterpret_cast<const char*>(str));i++){      printf("--for inner 1 is %d--\n",i);      *p_tx_buffer2++ = str[i];      printf("--for inner 2 is %d--\n",i);      //printf("%s",str[i]);  }  printf("--2--\n");  if (uart0 != -1)  {      int count = write(uart0, &tx_buffer[0], (p_tx_buffer2 - &tx_buffer[0]));      //Filestream, bytes to write, number of bytes to write      if (count < 0)      {          printf("UART TX error\n");      }      close(uart0);  }  ///////////////////////////////////////////////////////////////////  // 判斷參數格式和格式  if (args.Length() < 2 || !args[0]->IsString()) {    isolate->ThrowException(Exception::TypeError(      String::NewFromUtf8(isolate, "Wrong arguments")));    return;  }  // callback, 使用Cast方法來轉換  Local<Function> callback = Local<Function>::Cast(args[1]);  Local<Value> argv[1] = {    // 拼接String    String::Concat(Local<String>::Cast(args[0]), String::NewFromUtf8(isolate, " fuck world"))  };  // 調用回調, 參數: 當前上下文,參數個數,參數列表  callback->Call(isolate->GetCurrentContext()->Global(), 1, argv);}// 相當於在 exports 對象中添加 { hello: hello }void init(Handle<Object> exports) {  NODE_SET_METHOD(exports, "ArduinoDevice", hello);}// 將 export 對象暴露出去// 原型 `NODE_MODULE(module_name, Initialize)`NODE_MODULE(test, init);

 

unsigned char *foo();std::string str;str.append(reinterpret_cast<const char*>(foo()));

reinterpret_cast用法:
reinterpret_cast<type-id> (expression)
type-id 必須是一個指標、引用、算術類型、函數指標或者成員指標。
reinterpret_cast運算子是用來處理無關類型之間的轉換;它會產生一個新的值,這個值會有與原始參數(expressoin)有完全相同的位元位。例如:int *n= new int ;   double *d=reinterpret_cast<double*> (n);   在進行計算以後,d 包含無用值。這是因為 reinterpret_cast 僅僅是複製 n 的位元位到 d,沒有進行必要的分析。因此,需要謹慎使用 reinterpret_cast。 
IBM的C++指南裡倒是明確告訴了我們reinterpret_cast可以,或者說應該在什麼地方用來作為轉換運算子:

  1. 從指標類型到一個足夠大的整數類型
  2. 從整數類型或者枚舉類型到指標類型
  3. 從一個指向函數的指標到另一個不同類型的指向函數的指標
  4. 從一個指向對象的指標到另一個不同類型的指向對象的指標
  5. 從一個指向類函數成員的指標到另一個指向不同類型的函數成員的指標
  6. 從一個指向類資料成員的指標到另一個指向不同類型的資料成員的指標

        事實上reinterpret_cast的使用並不局限在上邊所說的幾項的,任何類型的指標之間都可以互相轉換,都不會得到編譯錯誤。上述列出的幾項,可能 是Linux下reinterpret_cast使用的限制,也可能是IBM推薦我們使用reinterpret_cast的方式。

 

C++:invalid conversion from 'unsigned char *' to 'const char *'

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.