打印
[技术问答]

NUC140RS485的问题

[复制链接]
2833|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangch_sh|  楼主 | 2014-7-10 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用NUC140VE3CN搞RS485通讯,从机往主机发数据,从机TXD端的波形和主机接收端的波形不一样。
少了一个字节,是地址字节。我把地址设为0xc0,
我发0XC0,0X00,0X55
收到的是0x00,0x55,0xc0奇迹消失。
这是怎么回事?请指教,谢谢!
沙发
mmuuss586| | 2014-7-10 18:01 | 只看该作者
可能程序不对吧;
程序发上来看看;

使用特权

评论回复
板凳
wangch_sh|  楼主 | 2014-7-10 18:06 | 只看该作者
主机:
初始化:
void RS485_Init(void)
{
        STR_UART_T sParam;
        DrvGPIO_InitFunction(E_FUNC_UART1);                         //串口引脚初始化
    sParam.u32BaudRate                 = 9600;                                  //波特率
    sParam.u8cDataBits                 = DRVUART_DATABITS_8; //8位数据位
    sParam.u8cStopBits                 = DRVUART_STOPBITS_1; //1位停止位
   
        sParam.u8cParity                 =DRVUART_PARITY_NONE ; //1位奇偶校验位
    sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;          //先进先出1字节缓冲区
        sParam.u8TimeOut        = 0x7F;                                           //设置延时
        DrvUART_Open(UART_PORT1,&sParam);                        //打开串口1
       

        r_pointer = 0;
        //sParam_RS485.u8cAddrEnable = DISABLE;                  //地址使能
        sParam_RS485.u8cAddrEnable = ENABLE;                  //地址使能
        sParam_RS485.u8cAddrValue  = 0xC0;                //地址
       
        sParam_RS485.u8cModeSelect = MODE_RS485_AAD;                //RS485模式选择
        sParam_RS485.u8cDelayTime  = 0;                                                  //延时
        sParam_RS485.u8cRxDisable  = FALSE;                                                 //使能接收
        DrvUART_SetFnRS485(UART_PORT1,&sParam_RS485);                //打开485

       
        DrvUART_ClearIntFlag(UART_PORT1, DRVUART_RDAINT);         //清中断标志
        DrvUART_EnableInt(UART_PORT1,DRVUART_RDAINT,
        (PFN_DRVUART_CALLBACK*)RS485_INT_HANDLE);          //使能485中断
        DrvUART_SetRTS(UART_PORT1,0,1);                                  //设置RTS
}

使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-7-10 18:07 | 只看该作者
主机接收中断:
//入口参数:无
//返回值  :无
//功能说明:RS485中断服务程序               
//
void RS485_INT_HANDLE()

{
       
        volatile char regRX;
       
        DrvGPIO_SetBit(E_GPE,14);
         regRX = UART1->DATA;                                //接收数据
         if(flag==1)                                                //标志位=1
         {
                
                if(RS485.Slave1_flag==1)
                {
                        RS485.Rec4851[r_pointer] = regRX;                //数组赋值
                       
                }
                else if(RS485.Slave2_flag==1)
                        RS485.Rec4852[r_pointer] = regRX;                //数组赋值
                else   if(RS485.Slave3_flag==1)
                        RS485.Rec4853[r_pointer] = regRX;                //数组赋值
                r_pointer++;                                        //指针加1
                if(r_pointer==2)                                //指针=2
                {
                   r_pointer=0;                                        //指针=0
                   flag=0;                                                //标志位清零
                   RS485.RS485_Cnt=0;
                }

         }
         else if(regRX==0xa5)                                        //帧头
         {
                 flag=1;                                                        //标志位=1
                 r_pointer=0;                                   //指针清零
               
         }
         
                
         
       
}

使用特权

评论回复
5
wangch_sh|  楼主 | 2014-7-10 18:08 | 只看该作者
从机初始化:
//入口参数:无
//返回值  :无
//功能说明:RS485初始化
//
void RS485_Init(void)
{
        STR_UART_T sParam;
       
        STR_RS485_T sParam_RS485;
       
       
        DrvGPIO_InitFunction(E_FUNC_UART1);                          //初始化串口引脚
       


       
    sParam.u32BaudRate                 = 9600;                   //波特率
    sParam.u8cDataBits                 = DRVUART_DATABITS_8;        //8位数据位
    sParam.u8cStopBits                 = DRVUART_STOPBITS_1;        //1位停止位
    sParam.u8cParity                 = DRVUART_PARITY_NONE;        //没有奇偶校验位
    sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;         //先进先出1个字节缓冲区
        sParam.u8TimeOut        = 0x7F;                        //延时
        DrvUART_Open(UART_PORT1,&sParam);                          //打开串口


        //sParam_RS485.u8cAddrEnable = DISABLE;           //地址使能
        sParam_RS485.u8cAddrEnable = ENABLE;           //地址使能
       
        sParam_RS485.u8cAddrValue  = 0xC0;                 //地址
       
        sParam_RS485.u8cModeSelect = MODE_RS485_AAD;           //RS485模式选择
        sParam_RS485.u8cDelayTime  = 0;                                           //延时
        sParam_RS485.u8cRxDisable  = FALSE;                                   //使能接收
        DrvUART_SetFnRS485(UART_PORT1,&sParam_RS485);           //设置Fn
                               

        DrvUART_SetRTS(UART_PORT1,0,1);                 //设置RTS
        DrvUART_ClearIntFlag(UART_PORT1, DRVUART_RDAINT); //清除中断标志
        DrvUART_EnableInt(UART_PORT1,DRVUART_RDAINT,
        (PFN_DRVUART_CALLBACK*)RS485_INT_HANDLE);         //使能485中断
}

使用特权

评论回复
6
wangch_sh|  楼主 | 2014-7-10 18:09 | 只看该作者
从机发送:
if(Request_flag==1)
                {
               
                       
                        DrvUART_SetRTS(UART_PORT1,1,0);                 //设置RTS
                        Request_flag=0;
                        send_dat[1]=((uint8_t)(RDO_66751>>8));                   //高字节
                        send_dat[2]=((uint8_t)(RDO_66751&0xff));                //低字节
                        RS485Send((uint8_t *)send_dat,TXBUFSIZE);        //RS485发送       
                       
                        DrvSYS_Delay(3000);
                        DrvUART_SetRTS(UART_PORT1,0,1);                 //设置RTS
                        //DrvUART_Write(UART_PORT0,(uint8_t *)send_dat,TXBUFSIZE);                //发送语音数据
                                        }

使用特权

评论回复
7
wangch_sh|  楼主 | 2014-7-11 08:24 | 只看该作者
高手支招啊!

使用特权

评论回复
8
从小木丁丁| | 2014-7-11 17:31 | 只看该作者
在看程序

使用特权

评论回复
9
haolaishi| | 2014-7-11 22:54 | 只看该作者
我有碰到过,波特率你串口软件改改,变为设置的一半就好了,不知道为什么,后面自动好了

使用特权

评论回复
10
linpochih| | 2015-3-2 15:58 | 只看该作者
主機初始化 部份
sParam_RS485.u8cModeSelect = MODE_RS485_AAD;                //RS485模式选择
應該是AUD
DrvUART_SetRTS(UART_PORT1,0,1);
應該是DrvUART_SetRTS(UART_PORT1,0,8); 輸出8bytes 期間RTS 為HI

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2814

帖子

5

粉丝