PSoCでバイナリ送受信

どうも、Ramencozoです。
前回Bluetoothバイスブッ壊してから久々にネタ追加でする(´ω`)

今回はPSoCマイコンでUARTな通信をする際にバイナリデータまんまな送受信を行いましょ、っていうネタです。

マイコンってバイナリデータしか扱わないんじゃないの、って話されそうですが。
実はPSoCではCでUARTなモジュールをガチャチャといじると、デフォでは文字列ベース(*char で中身はchar[]なソレ)でしかやりとりしてくんないです。特に、「PSoCからの送信」に関してはHexNumなバイナリデータ送信用の関数準備されてますが、受信に関しては文字列でデータが来たとしか認識してくれないです。

つまり、何らかのバイナリデータ列が送られてくると、ソレを自動的にASCIIコード表に当てはめて処理します。でもって文字列間の区切り(デリミタ)以下の数値となるデータ(デフォだとspace=0x20)は意味を持たないとして破棄されます。

これが故に、少し前にRashさんと共同製作した「LEDブン回して文字描いてみた」では、PSoCとPC間とで数値のやりとりをする際に「数値(0xXY)→文字列(0x3X,0x3Y)」に分割変換して送信してます。こうするとPSoC側では「文字で「数字のX」と「数字のY」が来た」と認識します。正直アレゲな実装ですハィ。

でもって先日、某卒研にてバイナリ送受信が必要になったので調べたところ、下記いくつか参考サイトが。

PSoC UART Binary 受信割り込み
PSoC バイナリ受信の備忘録。

上記サイトをばもくもくと読んでいったところ、「UART_1INT.asm」の中のコードの一部においてバイナリ受信するために邪魔になる箇所をコメントアウトするといい感じ。実際のが下記。


UART_1INT.asm

;---------前略---------
.UARTRX_NO_ERROR:
mov A,REG[UART_1_RX_BUFFER_REG ] ; Read the data buffer
; IF buffer not full
;----カット!----
; tst [UART_1_fStatus],UART_1_RX_BUF_CMDTERM ; Check for buffer full
; jnz .RESTORE_IDX_PP ; All done

;----カット!----
; cmp A,UART_1_CMD_TERM ; Check for End of command
; jnz .UARTRX_CHK_BACKSPACE
; or [UART_1_fStatus],UART_1_RX_BUF_CMDTERM ; Set command ready bit

;----カット!カット!----
; RAM_SETPAGE_IDX >UART_1_aRxBuffer
; RAM_CHANGE_PAGE_MODE FLAG_PGMODE_10b
; mov [X + UART_1_aRxBuffer],00h ; Zero out last data
; RAM_CHANGE_PAGE_MODE FLAG_PGMODE_00b
jmp .RESTORE_IDX_PP

.UARTRX_CHK_BACKSPACE:
IF(UART_1_BACKSPACE_ENABLE) ; Enable if backspace/delete mode
cmp A,UART_1_BACKSPACE_ENABLE ; Check for backspace character
jnz .UARTRX_IGNORE ; If not, skip the backspace stuff
cmp [UART_1_bRxCnt],00h ; Check if buffer empty
jz .RESTORE_IDX_PP ;
dec [UART_1_bRxCnt] ; Decrement buffer count by one.
jmp .RESTORE_IDX_PP
ENDIF

.UARTRX_IGNORE:
IF(UART_1_RX_IGNORE_BELOW) ; Ignore charaters below this value
;----カトカトカットカットォォッ!----
; cmp A,UART_1_RX_IGNORE_BELOW ; If ignore char is set to 0x00, do not
; jc .RESTORE_IDX_PP ; ignore any characters.
ENDIF
;---------後略---------

とまぁここまで書いといてなんですけど、実証してないのでこの後の部分についてはまた後日(゚∀゚)