標籤: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可以,或者說應該在什麼地方用來作為轉換運算子:
- 從指標類型到一個足夠大的整數類型
- 從整數類型或者枚舉類型到指標類型
- 從一個指向函數的指標到另一個不同類型的指向函數的指標
- 從一個指向對象的指標到另一個不同類型的指向對象的指標
- 從一個指向類函數成員的指標到另一個指向不同類型的函數成員的指標
- 從一個指向類資料成員的指標到另一個指向不同類型的資料成員的指標
事實上reinterpret_cast的使用並不局限在上邊所說的幾項的,任何類型的指標之間都可以互相轉換,都不會得到編譯錯誤。上述列出的幾項,可能 是Linux下reinterpret_cast使用的限制,也可能是IBM推薦我們使用reinterpret_cast的方式。
C++:invalid conversion from 'unsigned char *' to 'const char *'