|
|
|
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
│<< 前へ │次へ >> │一覧 │コメントを書く |
PSoCのUARTは受信割り込みの許可 UART_1_IntCntl(UART_1X_INT); //Enable RX interrupts を行うとバイナリーの受信割り込みができないんです。 UART_1_bCmdLength() で受信数を得て UART_1_szGetParam()で受信数分データを得ることができます。そして UART_1_CmdReset()で初期の状態にし再度この方法で繰り返すと受信内容のデータが間違っています。だからバイナリーの受信は割り込み許可で割り込みの受信ができないんです。なんとか良い方法はないかと思い受信割り込みをC言語だけで処理することにしました。 #include <m8c.h> //part specific constants and macros //ここを付け加えます。(受信割り込みをC言語で行う) #pragma interrupt_handler int_uart1_rx //UART_1_RX Interrupt unsigned int uart1_rxint_count; //UART_1_RX interrupt counter unsigned char recv_data[50]; //recv data unsigned char sumcrc_data[2]; //SUM CRC DATA main { UART_1_CmdReset(); //Initialize receiver/cmd buf. int_recv_test(); //UART 1 RX Interrupt test //----------------------------------------------------------- Loop1: //------------------------------------------------------- boot.asm の受信割り込みの内容を書き換える org 2Ch ;PSoC Block DCB03 Interrupt Vector 初期時のエラー解決を完了すれば割り込みのバイナリー受信は解決できます。もしエラーが起こってもSUM チェックやCRCチェックで受信ミスがわかりますので問題ないとおもいます。私はSUMチェックを使用しています。 //----------------------------------------------------------------------- va = 0; //---------------------------------------------------------------------- vd = 0xFFFF;
バイナリっていうのは、デリミタやターミネータに設定したデータを含むものってことですね。
ちょっと分からなかったのですが、これは元々の割込みハンドラの代わりにint_uart1_rxを呼び出すってことですか?(これは省略されてるんですよね?) シリアル通信でバイナリ通信はやっぱり必要になることもありそうなので興味あります。(2006年12月10日 23時19分27秒)
私もこれからPSoCを活用したいと考えています。
割り込みで UART_1_bCmdLength() =受信数 UART_1_szGetParam() =受信数分のデータ取得 ということですが、この機能は非常に有用ですね^^ UART_1_CmdReset()で初期の状態に戻すとき、データが化けるのであれば、UART_1_CmdReset()を使わなければ問題はないのでしょうか? その場合、受信数はどんどん増えるので、受信数を自分が作成するプログラムで管理すれば大丈夫なのでしょうか? できれば、UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれるとありがたいですね^^ この質問、的外れかもしれませんが、その場合はお許しください。^^(2006年12月17日 21時02分24秒)
K.Iさん
バイナリで通信する時はデミリッタ(CR=0Dh LF=0Ah)を含みます。00h-FFhの全てを使用しますのでデホルトの_UART_1_RX_ISRの割り込みを使用したプログラムは使用できません。_UART_1_RX_ISRはテキスト割り込みのみで考えてあるようです。UART_1のUser Modeule Parameter のCommand Teminator を13にすればUART_1_bCmdCheck()で13(CR)を受信した確認ができます。10に設定すればLFの確認ができると思います(確認はしていません) >バイナリっていうのは、デリミタやターミネータに設定したデータを含むものってことですね。 >ちょっと分からなかったのですが、これは元々の割込みハンドラの代わりにint_uart1_rxを呼び出すってことですか?(これは省略されてるんですよね?) >シリアル通信でバイナリ通信はやっぱり必要になることもありそうなので興味あります。 ----- (2006年12月18日 00時12分25秒)
PIC9801さん
UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれると問題解決できます。 UART_1_CmdReset()を使用しないと受信カウンターがどんどん増え受信バッファーがオーバーフローとなります。 >私もこれからPSoCを活用したいと考えています。 >割り込みで >UART_1_bCmdLength() =受信数 >UART_1_szGetParam() =受信数分のデータ取得 >ということですが、この機能は非常に有用ですね^^ >UART_1_CmdReset()で初期の状態に戻すとき、データが化けるのであれば、UART_1_CmdReset()を使わなければ問題はないのでしょうか? > >その場合、受信数はどんどん増えるので、受信数を自分が作成するプログラムで管理すれば大丈夫なのでしょうか? > >できれば、UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれるとありがたいですね^^ > >この質問、的外れかもしれませんが、その場合はお許しください。^^ ----- (2006年12月18日 00時39分02秒)
ということは、バイナリに対応させたint_uart1_rxというのをe-deviceさんが作られたんですね。
出来合いのAPIだけで出来れば楽だと思ったんですけど、まぁ、そのうち自分も考えてみます。(2006年12月19日 01時22分58秒)
K.Iさん
今日は、APIを使って試行錯誤、しっく八苦して挑戦しました。UART_1_bCmdLength()で5入力を3回確認後UART_1_CmdReset()を行いUART_1_bCmdLength()で読み取った時までは正常です。その後UART_1_bCmdLength()でその内容を読み取ると送信した内容と比較すると違っています。 バイナリーデータ、テキストデータに関わらずUART_1_bCmdLength()の内容で読み取りその後UART_1_CmdReset()を行う事の繰り返しであれば問題ありません。 上記の問題で長いバイナリーデータをAPIで受信処理事ができないのでint_uart1_rxを作成しました。簡単に説明しますと、受信割り込みで読み取りカウンターをインクルメントするだけです。 void int_uart1_rx(void) //UART_1_RX_ISR { recv_data[uart1_rxint_count]=UART_1_RX_BUFFER_REG; //recv data uart1_rxint_count++; } >ということは、バイナリに対応させたint_uart1_rxというのをe-deviceさんが作られたんですね。 >出来合いのAPIだけで出来れば楽だと思ったんですけど、まぁ、そのうち自分も考えてみます。 ----- (2006年12月20日 00時42分53秒)
e-deviceさん
もしかすると、APIにはちょっとバグがあるのかもしれませんね。 シリアル通信の実例って、意外と少ないのでありがたいです。 プログラムありがとうございます! 結構シンプルになりましたね。でも、こうなるまでに苦労されたと推察します。 今度、シリアル通信が必要な時に試させて頂こうと思います。 (2006年12月21日 01時48分00秒) │<< 前へ │次へ >> │一覧 │コメントを書く │ 一番上に戻る │ |