使用USART2连接两个PIC18F启动器套件

使用USART2连接两个PIC18F启动器套件,c,mplab,pic18,xc8,C,Mplab,Pic18,Xc8,我想使用RS232连接两个PIC18F启动器套件(带有PIC18F46J50)。因为USART1已经连接到读卡器(集成),所以我需要使用USART2(我需要将RX2/TX2重新映射到RP19/RP20引脚-RD2/RD3) 我已经找到一些用于发送的演示代码: #define _XTAL_FREQ 8000000 //The speed of your internal(or)external oscillator #include <p18cxxx.h> #include <

我想使用RS232连接两个PIC18F启动器套件(带有PIC18F46J50)。因为USART1已经连接到读卡器(集成),所以我需要使用USART2(我需要将RX2/TX2重新映射到RP19/RP20引脚-RD2/RD3)

我已经找到一些用于发送的演示代码:

#define _XTAL_FREQ 8000000 //The speed of your internal(or)external oscillator
 #include <p18cxxx.h>
 #include <usart.h>
int i = 0;

 // CONFIG1L
#pragma config WDTEN = OFF          // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
#pragma config PLLDIV =3            // PLL Prescaler Selection bits - Divide by 3 (12 MHz oscillator input)
#pragma config STVREN = ON          // Stack Overflow/Underflow Reset  (Enabled)
#pragma config XINST = OFF          // Extended instruction set disabled

// CONFIG1H
#pragma config CPUDIV = OSC1        // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF            // Code Protect (Program memory is not code-protected)

// CONFIG2L
#pragma config OSC = HSPLL          //HS oscillator, PLL enabled, HSPLL used by USB
#pragma config T1DIG = ON           // T1OSCEN Enforcement (Secondary Oscillator clock source may be selected)
#pragma config LPT1OSC = OFF        // Low-Power Timer1 Oscillator (High-power operation)
#pragma config FCMEN = OFF          //Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF           //Two-Speed Start-up disabled

// CONFIG2H
#pragma config WDTPS = 32768        // Watchdog Postscaler (1:32768)

// CONFIG3L
#pragma config DSWDTOSC = INTOSCREF // DSWDT Clock Select (DSWDT uses INTRC)
#pragma config RTCOSC = T1OSCREF    // RTCC Clock Select (RTCC uses T1OSC/T1CKI)
#pragma config DSBOREN = OFF        // Zero-Power BOR disabled in Deep Sleep
#pragma config DSWDTEN = OFF        // Deep Sleep Watchdog Timer (Disabled)
#pragma config DSWDTPS = 8192       //1:8,192 (8.5 seconds)

// CONFIG3H
#pragma config IOL1WAY =OFF         //IOLOCK bit can be set and cleared
#pragma config MSSP7B_EN = MSK7     // MSSP address masking (7 Bit address masking mode)

// CONFIG4L
#pragma config WPFP = PAGE_1        // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 0)
#pragma config WPEND = PAGE_0       //Start protection at page 0
#pragma config WPCFG = OFF          //Write/Erase last page protect Disabled

// CONFIG4H
#pragma config WPDIS = OFF             //WPFP[5:0], WPEND, and WPCFG bits ignored

 #define USE_AND_MASKS

unsigned char Txdata[] = "MICROCHIP_USART";
void Delay1Second(void);

 void main (void)
 {
     unsigned char spbrg=0,baudconfig=0,i=0;

     // REMAPE ID PORT

    PPSCON = 0x00;              // unlock peripheral Pin select register
    RPOR19 = 0x05;              // assign USART2 TX to RP19/RD2
    RPINR16 = 0x14;             // assign USART2 RX to RP20/RD3
    PPSCON = 0x01;              // lock peripheral Pin select register

    TRISDbits.TRISD2 = 0;       // TX2 output
    TRISDbits.TRISD3 = 1;       // RX2 input
 //------USART Setup ----

     Close2USART();  //turn off usart if was previously on

     spbrg = 51;

     Open2USART(USART_TX_INT_OFF &
                USART_RX_INT_OFF &
                USART_ASYNCH_MODE &
                USART_EIGHT_BIT &
                USART_CONT_RX &
                USART_BRGH_HIGH, spbrg);

     baudconfig = BAUD_8_BIT_RATE & BAUD_AUTO_OFF;
     baud2USART (baudconfig);

     PORTB = 0x03;

 while(1){

//------USART Transmission ----
    while(Busy2USART());             //Check if Usart is busy or not
   puts2USART((char *)Txdata);                //transmit the string
    Delay1Second();
   Close2USART();
}                         
 }

 void Delay1Second()
{
    for(i=0;i<100;i++)
    {
         __delay_ms(10);
    }
}
#定义_XTAL_FREQ 8000000//内部(或)外部振荡器的速度
#包括
#包括
int i=0;
//配置1L
#pragma config WDTEN=OFF//看门狗定时器(禁用-由SWDTEN位控制)
#pragma config PLLDIV=3//PLL预分频器选择位-除以3(12 MHz振荡器输入)
#pragma config STVREN=ON//堆栈溢出/下溢重置(已启用)
#pragma config XINST=OFF//扩展指令集已禁用
//配置1H
#pragma config CPUDIV=OSC1//CPU系统时钟后定标器(无CPU系统时钟分割)
#pragma config CP0=OFF//代码保护(程序内存不受代码保护)
//配置2L
#pragma config OSC=HSPLL//HS振荡器,PLL启用,USB使用HSPLL
#pragma config T1DIG=ON//T1OSCEN强制(可选择次级振荡器时钟源)
#pragma config LPT1OSC=关闭//低功率定时器1振荡器(高功率操作)
#pragma config FCMEN=OFF//Fail-Safe时钟监视器已禁用
#pragma config IESO=关闭//禁用双速启动
//配置2H
#pragma-config-WDTPS=32768//Watchdog-Postscaler(1:32768)
//配置3L
#pragma config DSWDTOSC=INTOSCREF//DSWDT时钟选择(DSWDT使用INTRC)
#pragma config RTCOSC=T1OSCREF//RTCC时钟选择(RTCC使用T1OSC/T1CKI)
#pragma config DSBOREN=OFF//Zero Power BOR在深度睡眠中禁用
#pragma config DSWDTEN=OFF//Deep Sleep Watchdog Timer(已禁用)
#pragma config DSWDTPS=8192//1:8192(8.5秒)
//CONFIG3H
#pragma config IOL1WAY=OFF//IOLOCK位可以设置和清除
#pragma config MSSP7B_EN=MSK7//MSSP地址屏蔽(7位地址屏蔽模式)
//配置4L
#pragma config WPFP=PAGE_1//写入/擦除保护页开始/结束位置(写入保护程序闪存页0)
#pragma config WPEND=第0页//从第0页开始保护
#pragma config WPCFG=OFF//Write/Erase last page protect Disabled
//配置4h
#pragma config WPDIS=OFF//WPFP[5:0],忽略WPEND和WPCFG位
#定义使用_和_掩码
无符号字符Txdata[]=“MICROCHIP_USART”;
无效延迟1秒(无效);
真空总管(真空)
{
无符号字符spbrg=0,baudconfig=0,i=0;
//重新映射ID端口
PPSCON=0x00;//解锁外围引脚选择寄存器
RPOR19=0x05;//将USART2 TX分配给RP19/RD2
RPINR16=0x14;//将USART2 RX分配给RP20/RD3
PPSCON=0x01;//锁定外围引脚选择寄存器
TRISDbits.TRISD2=0;//TX2输出
TRISDbits.TRISD3=1;//RX2输入
//------USART设置----
Close2USART();//如果先前已启用,则关闭usart
spbrg=51;
Open2USART(USART\U TX\U INT\U关闭&
USART\U RX\U INT\U OFF&
USART\u异步\u模式&
USART_八位&
USART\U CONT\U RX&
USART_BRGH_HIGH,spbrg);
baudconfig=BAUD_8_BIT_RATE&BAUD_AUTO_OFF;
baud2USART(baudconfig);
端口B=0x03;
而(1){
//------USART传输----
while(Busy2USART());//检查Usart是否忙
puts2USART((char*)Txdata);//传输字符串
延迟1秒();
Close2USART();
}                         
}
无效延迟1秒()
{

对于(i=0;i,我将假定您接线正确

您不需要中断来接收。它可能很有用,但不是必需的。要接收字符串,您只需执行以下操作:

gets2USART( str, 10 );
如果字符串长度为10个字符(包括空终止符)

如果您想要接收任意长度的字符串,您可以编写自己的
gets2USART
来读取直到空终止符为止。实际上非常简单,下面是
gets2USART
的源代码以帮助您:

void gets2USART(char *buffer, unsigned char len)
{
  char i;    // Length counter
  unsigned char data;

  for(i=0;i<len;i++)  // Only retrieve len characters
  {
    while(!DataRdy2USART());// Wait for data to be received

    data = getc2USART();    // Get a character from the USART
                       // and save in the string
    *buffer = data;
    buffer++;              // Increment the string pointer
  }
}
您可以看到已经有一个
while(Busy2USART());
,因此不需要添加一个。它是逻辑的,因为UART是按字节发送的,所以它在发送字节时很忙,函数需要检查每个字节

另外,您在使用后关闭UART,但实际上是循环以重做发送。因为您刚刚关闭了UART,所以这不起作用

void puts2USART( char *data)
{
  do
  {  // Transmit a byte
    while(Busy2USART());
    putc2USART(*data);
  } while( *data++ );
}