LPC1768 485通讯问题

Dreamer_LX灵 2015-11-14 07:36:07
我的设备(用A表示)通过串口0中断接收另一个设备(用B表示)发送的数据(分三帧发送),A设备收到正确的数据后需要应答,B设备才会发送剩余的数据。A设备和B设备是通过485通讯的,为了查看B设备发送的数据和A设备应答的数据是否正常,我在485线上挂了一个485转232的转换器,通过电脑串口接收485上的所有数据,发现B设备下发的数据是对的,A设备应答的数据也是对的,但是就是接收不到B设备的剩余数据(一种可能B设备没有收到A设备的回复,另一种可能B设备收到的回复数据有误),奇怪的是我通过电脑串口模拟应答数据给B设备,它就能发出剩余的数据,现在我也搞不懂了,怀疑是A设备串口发送的问题,相关代码如下,希望路过的各位帮忙看看,谢谢!

#ifndef __UART_H
#define __UART_H
#include "LPC17xx.h"

#define FOSC 12000000 /* 振荡器频率 */

#define FCCLK (FOSC * 8) /* 主时钟频率<=100Mhz */
/* FOSC的整数倍 */
#define FCCO (FCCLK * 3) /* PLL频率(275Mhz~550Mhz) */
/* 与FCCLK相同,或是其的偶数倍 */
#define FPCLK (FCCLK / 4) /* 外设时钟频率,FCCLK的1/2、1/4*/
/* 或与FCCLK相同 */
#define UART0_BPS (38400) /* 串口0通信波特率 */
#define UART3_BPS (19200) /* 串口3通信波特率 */
//#define UART_SBUF (LPC_UART0->RBR) /*串口0发送*/
#endif

/*********************************************************************************************************
** Function name: UART0_Init
** Descriptions: 按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void UART0_Init (void)
{
uint16_t usFdiv;

/* UART0 */
LPC_PINCON->PINSEL0 |= (1 << 4); /* Pin P0.2 used as TXD0 (Com0) */
LPC_PINCON->PINSEL0 |= (1 << 6); /* Pin P0.3 used as RXD0 (Com0) */

LPC_UART0->LCR = 0x83; /* 允许设置波特率 */
usFdiv = (FPCLK / 16) / UART0_BPS; /* 设置波特率 38400 */
LPC_UART0->DLM = usFdiv / 256;
LPC_UART0->DLL = usFdiv % 256;
LPC_UART0->LCR = 0x03; /* 锁定波特率 */
LPC_UART0->FCR = 0x06;

LPC_UART0->IER = 0x01; /* 使能接收中断 */
NVIC_EnableIRQ(UART0_IRQn); /* enable irq in nvic */
NVIC_SetPriority(UART0_IRQn, 0x02); /*中断优先级最高*/
}
/*********************************************************************************************************
** Function name: UART0_SendByte
** Descriptions: 从串口0发送数据
** input parameters: data: 发送的数据
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int UART0_SendByte (int ucData)
{
while (!(LPC_UART0->LSR & 0x20));
return (LPC_UART0->THR = ucData);
}


//*******************************************************************
#define RS485_1 ((uint32_t)1<<22)//P1.22 485控制脚
#define RS485_1_H (LPC_GPIO1->FIOSET =RS485_1) //RS485_1 置高 发送
#define RS485_1_L (LPC_GPIO1->FIOCLR =RS485_1) //RS485_1 置低 接收

if(call==1)//接收到正常数据后回复
{
TempBuf[0]=0xbb; TempBuf[1]=0x10; TempBuf[2]=0x06; TempBuf[3]=0x21;
TempBuf[4]=0x01; TempBuf[5]=0x38; TempBuf[6]=0x00; TempBuf[7]=0x55;

Delay(50);//延时

RS485_1_H;//485置高 发送
Delay(8);//大概2ms
for(i=0; i<8; i++)
{
UART0_SendByte(TempBuf[i]);
}
Delay(8);//大概2ms
RS485_1_L;//485置低 接收

call=0;
}
...全文
577 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
往昔如轮回 2016-10-09
  • 打赏
  • 举报
回复
1768有个寄存器是直接判断的 不用设置延时 延时时间不好控制 我当时也是这类似问题 花了我一周时间
DamonZheng 2016-02-29
  • 打赏
  • 举报
回复
如果没记错,我们当时加了个隔离器的,还有什么终端电阻,抗共模干扰啥的,不然很不稳定。加延时治标不治本
DamonZheng 2016-02-29
  • 打赏
  • 举报
回复
发一个字节,用示波器看数据和时序,看连接两端的电压情况,有可能数据到达另一端的时候,时序和电压已经有误差了。查硬件电路情况。两个设备连接后,485端口已经形成一个闭路系统了。
Dreamer_LX灵 2015-11-15
  • 打赏
  • 举报
回复
引用 1 楼 w22net 的回复:
lpc的片子有外设库用吗,没用过lpc ,用过st的有标准外设库
这个好像没有,这个现象听奇怪的,485置高和置低都加了延时,刚开始不加延时数据会出错的,而且没发送一个字节,我也加延时调试过,好像有点作用,但是这个时间很难调。
w22net 2015-11-15
  • 打赏
  • 举报
回复
lpc的片子有外设库用吗,没用过lpc ,用过st的有标准外设库

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧