<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

PC:PIC 接続[シリアル編]

2008年07月08日 | PIC・マイコン
                                                   日記@BlogRanking
PCとPICをシリアル(RS232C)で接続するには、
このようなUSB・シリアル変換ケーブルを使うと、このようなRS232CインターフェースICが必要である。

世の中には、こういったRS-232C - TTLレベルの簡易変換方法もあるが。
<紙>は、UP12 USB-PDC Converterを使っている。
PDCコネクタを分解して、3線(Tx、Rx、GND)をブレッドボードに挿している。

そこで、Active BASICフォーラムにある、RS232C 通信用プログラムを参考に、
<紙>流のサブプログラム(インクルードファイル:RS232Cdecl.sbp)を作った。詳細は、後記。

上記からDLした、RS232Ctest.lzh に入っている、RS232Ctest.sbp を使う。
RS232Cdecl.sbp では、シリアルポートをオープンする関数 CommOpen を定義した。

CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
 Ppari As Long, Pstop As Long ) As HANDLE
'    Pcomm:"COM2"のようにポート名を指定する。
'    Pbaud:9600,19200,115200 等々、速度を指定する。
'    Psize:7 か 8 で、データ長(ビット数)を指定する。
'    Ppari:1 か 0 で、パリティの有無を指定する。
'    Pstop:1 か 2 で、ストップビット長を指定する。
'    戻り値は、COMポートのハンドルである。

これを用いたシリアル通信を行う、サンプルプログラムを示す。
PCのシリアルポート(Dサブ9ピン)でも、上記UP12でも同じように使える。
(エラー処理は省略する)
'------------------- < Active BASIC > -----------------
#include "RS232Ctest.sbp"
#include "RS232Cdecl.sbp"
#prompt
'
Dim hComm As HANDLE 'COMポートハンドル
Dim a$ As String, buf[20] As Byte, k As Long
'
hComm=CommOpen("COM2",115200,8,0,1) ' オープンCOMポート
'            COMポート名,Baud,Bits,Pari,Stop
'
buf[0]=&H41 : buf[1]=&H42 : buf[2]=0 : k=2 ' "AB"の2文字を送出する例。
WriteFile(hComm,buf,k,VarPtr(k),ByVal 0)
'
ReadFile(hComm, buf,20,VarPtr(k), ByVal 0) ' 受信文字列をプリントする例。
buf[k]=0 : Print "受信文字列=";MakeStr(buf)
'
CloseHandle(hComm) ' クローズ COMポート
End
' --------------------------------- プログラム終了。

<紙>はこのようなプログラムでPICと接続している。

RS232Cdecl.sbp のソースを示す。(段付けのために、先頭に2B空白がある)
'-------------------------------- < RS232Cdecl.sbp > -------------------
Function CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
  Ppari As Long, Pstop As Long ) As HANDLE 'シリアルポートをオープンする
Dim comname[10] As Byte, MsgD As *Byte
Dim a$ As String, hComm As HANDLE

comname[0]=0 : lstrcpy(comname,StrPtr(Pcomm)) '使用するポート
'ポートのオープン
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0,
 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hComm = -1 Then
 MsgD=lstrcat(comname,"が使えません") 'ポートオープン失敗時
 MsgD[16]=0 : a$=MakeStr(MsgD) : Print a$
 Input "OK";a$
 End '強制終了
End If
CommOpen=hComm

'シリアル通信の設定
GetCommState(hComm, stDCB)
 stDCB.BaudRate = Pbaud '転送速度の指定(9600/115200,・・・)
 stDCB.ByteSize = Psize 'ビット長の指定(8/7)
 stDCB.fBitFields = &H1311 'バイナリモードON,Xon/Xoff制御ON,RTS強制起動,DTR強制起動
 stDCB.Parity = Ppari 'パリティの設定(0:パリティなし / 1:あり)
 stDCB.StopBits = Pstop - 1 'ストップビット数を指定(1/2 ビット)
 stDCB.XonChar = &H11
 stDCB.XoffChar = &H13
 stDCB.XonLim = 2048
 stDCB.XoffLim = 512
SetCommState(hComm, stDCB) '必要な部分だけ書き換える

'タイムアウトの設定
GetCommTimeouts(hComm,timeOut)
 timeOut.ReadIntervalTimeout = 10 '文字の読み込み待ち時間(10ms)
 timeOut.ReadTotalTimeoutMultiplier = 10 '読込の1文字あたりの時間(10ms)
 timeOut.ReadTotalTimeoutConstant = 2000 '読込の定数時間(2000ms)
 timeOut.WriteTotalTimeoutMultiplier = 0 '書込の1文字あたりの時間(0:タイムアウトしない)
 timeOut.WriteTotalTimeoutConstant = 0 '書込の定数時間(0:タイムアウトしない)
SetCommTimeouts(hComm, timeOut) 'タイムアウトの設定

End Function
'---------------------------------

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking
コメント
この記事をはてなブックマークに追加