저는 rs232 용 PIC18F4620을 사용하여 PC (리눅스)의 통신을 실현하려고합니다. Transmition (PIC -> PC는 괜찮습니다). 그러나 PC에서 PIC로 somenthing을 전달하려고하면 PIR1bits.RCIF 플래그가 설정되지 않고 인터럽트가 발생하지 않습니다. 이다PIC18f4620 SDCC에서 수신하십시오
내 (PIC18F) 코드 (한 버전) : 내가 한 PC에서
/*
* sdcc --use-non-free -mpic16 -p18f4620 test_lcd_serial.c
* stty -F /dev/ttyUSB0 9600
*/
#include <pic18fregs.h>
#include <pic18f4620.h>
#include <delay.h>
#include <stdio.h>
#include <usart.h>
#include "lcd.c"
//__code char __at 0x300000 _conf0 = 0x00;
//~ __code char __at __CONFIG1H _conf1 = 0x06;// oscilador HS-PLL
__code char __at __CONFIG1H _conf1 = 0x02;// oscilador HS
__code char __at __CONFIG2L _conf2 = 0x1e;
__code char __at __CONFIG2H _conf3 = 0x1e;
__code char __at 0x300004 _conf4 = 0x00;
__code char __at __CONFIG3H _conf5 = 0x01;
__code char __at __CONFIG4L _conf6 = 0x81;
__code char __at 0x300007 _conf7 = 0x00;
__code char __at __CONFIG5L _conf8 = 0x0f;
__code char __at __CONFIG5H _conf9 = 0xc0;
__code char __at __CONFIG6L _confA = 0x0f;
__code char __at __CONFIG6H _confB = 0xe0;
__code char __at __CONFIG7L _confC = 0x0f;
__code char __at __CONFIG7H _confD = 0x40;
char buf[255];
void main(void)
{
unsigned char count;
unsigned char caracter;
lcd_init(FOURBIT_MODE);
lcd_home();lcd_puts("Start Test"); delay_s(1);
lcd_home();lcd_puts("Start Test."); delay_s(1);
lcd_home();lcd_puts("Start Test.."); delay_s(1);
lcd_home();lcd_puts("Start Test..."); delay_s(1);
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
usart_open(
USART_TX_INT_OFF & //0x7f
USART_RX_INT_ON & //0xff
USART_BRGH_HIGH & //0xff
USART_EIGHT_BIT & // 0xfd
USART_ASYNCH_MODE, //0xfe
129 // 9600 at 20MHz
);
stdout = STREAM_USART;
count = 1;
while(1){ //This works fine :)
printf("To PC: %i\r", count);
sprintf(buf, "Sent: %i", count);
//even if I print (in LCD) the PIR1bits.RCIF is always 0
// sprintf(buf, "Sent: %i,%i", count, PIR1bits.RCIF);
lcd_home();lcd_puts(" ");
lcd_home();lcd_puts(buf);
delay_ms(500);
count++;
}
}
void printrx(){
unsigned char pnt = 0;
while(PIR1bits.RCIF){
buf[ pnt++ ] = RCREG;
// clear CREN
// RCSTAbits.CREN = 0;
// RCSTAbits.CREN = 1;
}
if(pnt){
sprintf(buf, "GOT1 %s", buf);
lcd_home();lcd_puts(" ");
lcd_home();lcd_puts(buf);
delay_ms(1000);
}
}
void receive_intr1() interrupt 1 { //this is never call
if(PIR1bits.RCIF) // serial received
printrx();
}
void receive_intr2() interrupt 2 {
if(PIR1bits.RCIF) // serial received
printrx();
}
:
>cat /dev/ttyUSB
To PC: 1
To PC: 2
To PC: 3
To PC: 4
To PC: 5
To PC: 6
To PC: 7
To PC: 8
To PC: 9
To PC: 10
...
그래서, PC에 PIC는 OK입니다. 그러나 나는하려고하면
에코 "뭔가">는/dev/ttyUSB0를
또는
cat > /dev/ttyUSB0
something
또는 내가 열 수있는 코드를 작성하는 경우에도는/dev/ttyUSB0를 A와 파일 및 쓰기, 파이썬 직렬 모듈을 사용하면 아무 일도 일어나지 않습니다.