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
#include "PSoCAPI.h" //PSoC API definitions for all User Modules
#include <string.h>
#include <stdlib.h>
//ここを付け加えます。(受信割り込みを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.
UART_1_IntCntl(UART_1_ENABLE_RX_INT); //Enable RX interrupts
UART_1_Start(UART_1_PARITY_NONE); //Enable UART
int_recv_test(); //UART 1 RX Interrupt test
}
//-----------------------------------------------------------
void int_recv_test(void) //UART 1 RX Interrupt test
{
unsigned int c;
unsigned char *send_buf;
Loop1:
if(uart1_rxint_count == 10){ //UART_1_RX interrupt counter
uart1_rxint_count = 0; //UART_1_RX interrupt counter
send_buf = &recv_data[0];
for(c=0; c<10; c++){
UART_1_SendData( *(send_buf + c) );
while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ) ); //send end loop
}
UART_1_PutCRLF();
}
else{
goto Loop1;
}
}
//-------------------------------------------------------
boot.asm の受信割り込みの内容を書き換える
org 2Ch ;PSoC Block DCB03 Interrupt Vector
ljmp _int_uart1_rx ;UART_1_RX Interrupt
//ljmp _UART_1_RX_ISR
reti
初期時のエラー解決を完了すれば割り込みのバイナリー受信は解決できます。もしエラーが起こってもSUM チェックやCRCチェックで受信ミスがわかりますので問題ないとおもいます。私はSUMチェックを使用しています。
//-----------------------------------------------------------------------
void sum_check(int kazu,unsigned char *adress) //SUM CHECK
{
unsigned int c;
unsigned int i;
unsigned int va;
unsigned int vz;
va = 0;
for(c = 0; c < kazu; c++){
va = va + *(adress + (c)); //
}
vz = va & 0xFF00;
vz = vz >> 8;
sumcrc_data[0] = vz; //MSB
sumcrc_data[1] = va & 0x00FF; //LSB
}
//----------------------------------------------------------------------
void crc_check(int kazu,unsigned char *adress) //CRC CHECK
{
unsigned int c;
unsigned int i;
unsigned int ia;
unsigned int va;
unsigned int vd;
unsigned int vc;
unsigned int vz;
vd = 0xFFFF;
for(c = 0; c < kazu; c++){
vc = *(adress + (c)); //
vd = vd ^ vc; //
for(ia=0; ia < 8; ia++){
vz = vd & 0x0001; //0 Bit
if(vz == 1){
vd = vd >> 1;
vd = vd ^ 0xA001; //EXOR
}
else{
vd = vd >> 1;
}
}
}
sumcrc_data[0] = (vd/256); //MSB
sumcrc_data[1] = vd & 0x00FF; //LSB
}