Pages

2010-01-12

虛擬串列埠

現在Notebook電腦為了體積小而美,大部分沒有串列埠(Serial Port, 通稱COM埠)
外面賣的USB轉COM線材轉換晶片常常是假貨,驅動程式良莠不齊。
為了能在NB上模擬Serial Port的讀寫動作,我從完全陌生->僅會讀寫->了解COM通訊理論
也發現市面上有虛擬SerialPort的商業軟體,有提供ActiveX的控制虛擬埠的元件。

我也把網路Socket傳輸通訊的Queue/Checksum應用到串列埠的讀取上
最後,當發現有免費的com0com虛擬串列的Driver支援
我也興起自己寫作虛擬串列埠的念頭,畢竟這是掌握虛擬埠應用的技術重點。

首先,要先了解com0com的Driver控制方式,用C#寫出能簡易控制虛擬埠的管理程式:
SNAGHTML706fad6

透過管理物件Manager能快速新增虛擬埠,User不需了解com0com的內部管理機制及例外狀況:
VirtualSerialPortManager.Setup.ComAddAsync(start, count);

查看「裝置管理員」,可看到這些虛擬埠的裝置: (這得研究Driver安裝上的認證佈署方式)
SNAGHTML709f07a

接下來是最主要的重點,就是如何透過Event方式來Programmer監控經過這些虛擬埠的資料。
只要透過下面的OnRxCharRead事件,即可監控虛擬埠的資料,再作其他的Mapping輸出應用:
SNAGHTML706260b

Manager也提供對這些虛擬埠的寫入函式(Write()),也提供貼心切片傳送(WriteSlice())機制。
最後,擬擬埠的流量控制與速度調整,則有待實務應用時再作測試與調整。

本想等有案子才把這虛擬技術實作出來,沒想到天氣冷一衝動,
就…油然而生出來了。

2010-01-08

SQL-LIMIT分頁查詢語法轉換

以前使用SQL Server,要實現分頁語法很麻煩,總不如MySQL中的LIMIT語法來得直覺:
SELECT * FROM Table1 LIMIT 10, 20     // index, count, 取出第11-30筆資料

微軟到了SQL Server 2005之後,有了ROW_NUMBER()來實現分頁,但SQL語法只是更加複雜
很奇怪微軟為何不支援LIMIT語法(可google,但找不到中肯的答案),
為了維持資料庫MySQL切換SQL Server的分頁語法一致性,
只好自己來寫SQL分頁LIMIT語法的字串轉換函式:
SNAGHTMLa26b713

此轉換函式範例:
string sql;
string sql2 = “SELECT * FROM Table1 ORDER BY Date1 LIMIT 10, 20”;
cmd.CommandText = SqlLimitConvert(sql);

// SQLServer分頁函式需要OrderBy欄位,原文若無則要自訂加入,否則會產生例外。
sql = “SELECT * FROM Table1 LIMIT 10, 20”;
cmd.CommandText = SqlLimitConvert(sql, “Date1 ASC”);