VS2005 RS-232C バグの件
これはソフトウェアーの純技術的なことなので
殆どの人はスルーでお願いします。
私のホームページから回って来られた方いらっしゃい。
VB2005でRS-232Cの受信のサンプルコードを書いた。
C#コード
private void SerialPort1_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
//データ受信用のバイト配列
byte[] inByte = new byte[serialPort1.BytesToRead];
//データの読み込み
serialPort1.Read(inByte, 0, serialPort1.BytesToRead);
VB2005コード
Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles SerialPort1.DataReceived
'データ受信用のバイト配列
Dim inByte(SerialPort1.BytesToRead - 1) As Byte
'データの読み込み
SerialPort1.Read(inByte, 0, SerialPort1.BytesToRead)
このたった2行のコードの中にバグが潜んでいた。
さてどこでしょうか?
serialPort1.BytesToReadはバッファの状態を読んでその時の受信データの 長さをByte単位で返すのであるが、実はこのC#とVB2005のコードは この長さを2度読みに行っている。
そしてこれが問題なのだ。
すなわち一度目の配列を確保する為に読みに行った時と、実際に serialPort1.BytesToReadで データを読みに行った時とで返す値が違う可能性があるのだ。
普通のソフトでは考えられないのであるが、RS-232Cの場合は十分考えられる。
次から次にデータが受信されるので配列を確保している間に次のデータを受信して しまうのだ。
そしてあの恐ろしいエラーが出る「配列の長さが範囲を超えている...」と。
これを解決するためには一回だけ読みに行けばよいのである。
書き直されたコード
C#コード
int dataLength = serialPort1.BytesToRead;
//データ受信用のバイト配列
byte[] inByte = new byte[dataLength];
//データの読み込み
serialPort1.Read(inByte, 0, dataLength);
VB2005コードとすればいいのです。
Dim dataLength as Integer = SerialPort1.BytesToRead
'データ受信用のバイト配列
Dim inByte(dataLength - 1) As Byte
'データの読み込み
SerialPort1.Read(inByte, 0, dataLength)
掲示板に投稿してくれた「たかさん」ごめんなさい。
と言ってもこんな所は読まないか。
2010年02月17日 Posted by igoten at 17:42 │Comments(0) │PC
危機(番外編)

さてここまで書くとこの続きは危機1に戻るのだ。
まだももう少しこの話には続きが有る。
その前にちょっと整理をしておく。
私が当時難しいとされていたヘルニアの手術をする決心をしたのは 私の担当医の石田先生が自分でも同じ病院でヘルニアの手術を したと言ったからである。
相当な偶然である。 これを読まれた方の中には「オイオイいい加減なこをを言うな」と 思われる方もいるかもしれない。
しかし私は当時のことを少しずつ調べながら書いている。
インターネットというものは恐ろしいもので、私が昨日書いた記事が既にGoogleで検索出来る。
「デュッセルドルフ 石田先生」と検索すると私のブログが2番目にヒットする。
つまりどこで誰が読むか分からないのである。
いい加減なことなど書けない。
下の写真を見ていただきたい、これは当時デュッセルドルフに会社を持つ 企業の奥さんたちが初めてこの地を訪れる人の為に書いたドイツの暮らし方の 雑誌である。

この雑誌の医者の欄に石田先生のことが載っている、電話番号も。

そこで私はグーグリました、この病院を。
有りました、もう結構お歳のはずですが。
もしかした私が診てもらった石田先生の息子さんかも知れない。

「石田嘉一博士 外科のスペシャリスト」と書いてあります。
先生まだお元気なのかな。
さて手術後に私は手術した担当医から立たせてもらった、そして彼は 手術は成功したと言ったのだが、まだまだ私の災難は続くのである。
つづく。。。
話が長くなって読まれてる方も飽きてきたと思い、本日は デザインを変えてみました。
こんなのどうかな。
一番飽きてるのは私か(^^;