2015年7月10日 星期五

[Linux C] C語言上Modbus RTU CRC16計算教學與實作


一、Modbus CRC-16

Modbus CRC-16是屬於邏輯運算的一種,假設現在有一個串資料是0x01, 0x25,想要運算,其算法如下:


  • 步驟一:先將一個16bit(在C中可以使用unsigned short)暫存器設為0xFFFF,這邊先命名該暫存器為crc。
  • 步驟二:將crc與資料的1個byte做XOR運算,這邊的舉例第一次就是與0x01做XOR,第二次就是0x25
  • 步驟三:接下來,將crc向右位移1個bit,並且最高有效位元(MSB)填0。
  • 步驟四:在位移前的crc,若其最低有效位元(LSB)是1,則將位移後的CRC對0xA001做運算。
  • 接下來繼續重複步驟3~4,直到做滿8次
  • 步驟五:接下來將Data的下一個byte拿來做步驟二到四,直到全部資料皆運算完為止。

我們來看個圖例吧!下圖是將1個byte的資料:0x01拿來運算的過程。

[Linux C] libwebsocket 隨手筆記


此篇稍為記錄一下在C上面時做websocket時遇到的問題...


---

(a)  callback function

return 0;

之前不小心return ;造成websocket的connection都無法建立


---

(b)libwebsocket_write

想要將資料寫出去必須使用libwebsocket_write的函式回傳

下面來個簡單的範例!

char *text = "Hello World!";
   int len = strlen (text) + 1;
   unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
   /* copy string including terminating NUL */
   memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
   libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
   free(buf);




2015年7月9日 星期四

[Linux] libudev抓取裝置描述


本篇是打算記錄一下使用libudev抓取device某些描述的方法。

例如:VID/PID本身是兩串數字,但是在/usr/share/misc/usb.ids這個文件裡面是有對應的字串的。

題外話..VID跟PID可以再http://www.linux-usb.org/usb.ids找到其對應

所以有需要的時候可以從上述網址更新一下你的usb.ids

--

我們來看一下簡單的範例,透過linux指令lsusb -v可以看到很多裝置的資訊。

2015年7月7日 星期二

[Linux C] C語言程式中,在BSON裡加入JSON


JSON是JavaScript Object Notation的縮寫,而BSON內的成員也是跟JSON類似,不過是擺二進位(Binary)



而BSON是 MongoDB使用的格式,怎麼使用JSON跟BSON這就不贅述了!

想必再搜尋這樣功能時的讀者應該都已經清楚兩者格式

----

測試環境

作業系統:Ubuntu - 15.04 x64
Library: libjson-c & libmongoc