java pic 通信_dsPic33E:RS485通信问题

博主在使用dsPic33E微控制器通过RS485端口进行串行通信时遇到了问题。当发送特定数据(如0x00, 0x01)时,接收到的数据总是反码。通过环回逻辑测试,发现任何发送的值都会被转化为0x00。问题可能出在硬件配置、中断处理或通信协议设置上。代码中展示了初始化和中断处理部分,但具体错误原因未明。博主希望找到解决该问题的方法。
摘要由CSDN通过智能技术生成

我在通过RS485端口串行通信时遇到问题 .

我正在使用带有Max485的dsPic33E微控制器 .

使用断点我分析了每当我发送 "0x00" 到控制器时,收到 "0xFF" . 然后我发送 "0x01" , "0xFD" 在控制器上收到 . 依此类推 .

此外,我尝试使用环回逻辑,意味着发送回收到的字符,但每次我收到 "0x00" 任何发送的值 .

我无法解决这个问题 . 下面是我正在使用的代码的快照:

// RS485

TRISBbits.TRISB6 = INPUT_PIN; // RX - RB6/RP38 PIN<42>

TRISBbits.TRISB7 = OUTPUT_PIN; // TX - RB7/RP39 PIN<43>

TRISBbits.TRISB8 = OUTPUT_PIN; // !RE/DE Control Pin RB8/RP40 PIN<44>

// RS485 Config

#define RS485_TX PORTBbits.RB6 // RS485 Transmitter

#define RS485_RX LATBbits.LATB7 // RS485 Reciever

#define RS485_CTRL LATBbits.LATB8 // RS485 Control Pin

void __attribute__((interrupt, no_auto_psv)) _U4RXInterrupt(void)

{

rs485Char = U4RXREG;

RS485_CTRL = 1; // Enable driver

U4TXREG = rs485Char;

RS485_CTRL = 0; // disable driver RE/DO

}

void InitClock( void )

{

PLLFBD = 63; // M=65

CLKDIVbits.PLLPOST = 0; // N2=2

CLKDIVbits.PLLPRE = 0; // N1=2

// Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)

__builtin_write_OSCCONH(0x01);

__builtin_write_OSCCONL(OSCCON | 0x01);

// Wait for Clock switch to occur

while (OSCCONbits.COSC!= 0b001);

// Wait for PLL to lock

while (OSCCONbits.LOCK!= 1);

}

void InitRs485(void){

// configure U1MODE

U4MODEbits.UARTEN = 0; // Bit15 TX, RX DISABLED, ENABLE at end of func

U4MODEbits.URXINV = 1; // 1:URXINV Idle state is '0' ; 0=UxRX Idle state is '1';

U4MODEbits.ABAUD = 0; // Bit5 No Auto baud (would require sending '55')

U4MODEbits.BRGH = 0; // Bit3 16 clocks per bit period

U4MODEbits.PDSEL = 0; // 0 : 8 bit,no parity; 1 : 8 bit,even parity; 2 : 8 bit,odd parity; 3 : 9 bit,no Parity

U4MODEbits.STSEL = 1; // 1 : 2 Stop bits; 0 : 1 Stop bits

// Load a value into Baud Rate Generator.

U4BRG = BRGVAL_RS485; // 60Mhz osc, 9600 Baud

// Load all values in for U1STA SFR

U4STAbits.UTXISEL1 = 0; // Bit15 Int when Char is transferred (1/2 config!)

U4STAbits.UTXISEL0 = 0; // Bit13 Other half of Bit15

U4STAbits.UTXINV = 1; // 1:UxTX Idle state is '0' ; 0=UxTX Idle state is '1';

U4STAbits.UTXBRK = 0; // Bit11 Disabled

U4STAbits.UTXEN = 0; // Bit10 TX pins controlled by peripheral

U4STAbits.URXISEL = 0; // Bits6,7 Int. on character received

IPC22bits.U4RXIP = 7;

IPC22bits.U4TXIP = 7;

IFS5bits.U4TXIF = 0; // Clear the Transmit Interrupt Flag

IEC5bits.U4TXIE = 1; // Enable Transmit Interrupts

IFS5bits.U4RXIF = 0; // Clear the Receive Interrupt Flag

IEC5bits.U4RXIE = 1; // Enable Receive Interrupts

RPOR2bits.RP39R = 0x1D; // dsPic33EP512GM604 => RP39 as U4TX PIN<43>

_U4RXR = 38; // dsPic33EP512GM604 => RP38 as U4RX PIN<42>

U4MODEbits.UARTEN = 1; // And turn the peripheral on

U4STAbits.UTXEN = 1;

// Hardware control bits

RS485_CTRL = 0; // disable driver

IEC5bits.U4RXIE = 1;

}

int main(int argc, char** argv) {

InitClock(); // This is the PLL settings

InitPorts(); // Configure all Input/Output Ports

InitUarts(); // Initialize UART1 for 9600,8,N,1 TX/RX

Rs485Initialise( 0x10, 0x10);

while( 1 )

{

}

return (EXIT_SUCCESS);

}

这是一个测试代码 . 实际通信将使用Modbus协议 . 请帮我纠正这个问题 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值