论坛

使用AVR32UC3B0512处理通讯超时

开始于 安德鲁 2012年5月24日
你好

我需要能够处理项目的通讯超时。我已经读过 数据表中的相关部分,但缺少信息。

我修改了以下函数以初始化超时:

int usart_init_rs232(易失性结构avr32_usart_t * usart,结构 usart_options_t * opt,长cpu_hz)
{
int retval;

/ *重置usart并关闭RX和TX * /
usart_reset(usart);

/ *控制输入值* /
if(opt == 0)/ *空指针* /
返回USART_INVALID_INPUT;
if (选择->charlength < 5 || opt->charlength > 9)
返回USART_INVALID_INPUT;
if (选择->paritytype > 7)
返回USART_INVALID_INPUT;
if (选择->stopbits > 2+255)
返回USART_INVALID_INPUT;
if (选择->channelmode > 3)
返回USART_INVALID_INPUT;

如果((retval = usart_set_baudrate(usart,opt->波特率,cpu_hz))!= \
USART_SUCCESS)
return retval;

if (选择->charlength == 9) {
/ *字符长度设置为9位; MODE9支配CHRL * /
usart->mr |= (1< } 其他 {
/ *当USART_MODE9 = 0时CHRL给出charlength(-5)* /
usart->mr | ((opt->charlength-5) <<AVR32_USART_MR_CHRL_OFFSET);
}

usart->mr |= (选择->channelmode <<AVR32_USART_MR_CHMODE_OFFSET)|
(选择->paritytype <<AVR32_USART_MR_PAR_OFFSET);

if (选择->stopbits > 2)
{
/ *设置两个停止位* /
usart->mr |= (2 <<AVR32_USART_MR_NBSTOP_OFFSET);
/ *由计时员提供其余时间* /
usart->ttgr = (选择->stopbits-2);
}
else
/ *插入1、1.5或2个停止位* /
usart->mr |= (选择->stopbits <<AVR32_USART_MR_NBSTOP_OFFSET);

/ *设置完成;启用通讯* /
/ *启用输入和输出* /
usart->cr |= (1< (1<
//设置超时值
usart->rtor = 0x1FFFF;
//启用超时
usart->cr |= (1<
返回USART_SUCCESS;
}

我修改了usart_read_char()以处理超时:

int usart_read_char(易失性结构avr32_usart_t * usart,int * c)
{
/ *检查错误;帧,奇偶校验和超限在RS485模式下为奇偶校验
错误将表示我们收到了一个地址char * /
if (usart->csr &
((1 <<AVR32_USART_CSR_OVRE_OFFSET)|
(1 <<AVR32_USART_CSR_FRAME_OFFSET)|
(1 <<AVR32_USART_CSR_PARE_OFFSET))){

返回USART_RX_ERROR;
}

else 如果(我们->csr & (1 <<AVR32_USART_CSR_TIMEOUT)){
usart->cr |= (1< usart->cr |= (1< 返回USART_RX_ERROR;
}
/ *没有错误;如果我们确实收到了一个字符,请阅读并返回成功* /
else if ((usart->csr & (1< * c =(无符号短)usart->rhr;
usart->cr |= (1<
返回USART_SUCCESS;
} 其他 {
返回USART_RX_EMPTY;
}
} / * usart_read * /

当超时发生时,它被检测到,但是usart似乎崩溃了。我可以 监视微控制器与它正在通信的设备之间的通信 与,我可以看到微发送正确的命令,另一个 设备返回正确的信息,但usart仅生成通讯 错误,因此我无法读取任何有效数据。

有人可以给我一些如何处理通讯超时的提示吗 AVR32,以及如何重置usart使其不返回伪字符 subsequent reads.

提前致谢

安德鲁

你好
当您收到一个字节时,必须阅读找到的io寄存器UCSRA 错误标志,读取UCSRA重置错误。
另一方面,如果您通过RS232通道连接2 mcu小于10m 电缆,您的桅杆没有问题。
通常我使用中断来通过UART发送和接收数据,我定义了 Txd &Rxd结构,然后是Rxd& Txdvariables, a pointer for each (pRxd, pTxd)和每个计数器(RxCnt,TxCnt)。
例子:
   结构hRxd
   {
         整数a,b,c;
         字符f [20];
        ...
   };
   结构hRxd 接收   
   字符* pRxd =&Rxd ;
   字符RxCnt = 0;
在RXC中断服务程序中存储数据:
   字符

   s = UCSRA; //听到您测试错误标志
   *(pRxd + RxCnt)= UDR; 
   如果(++ RxCnt>= sizeof(Rxd)
   {
      RxCnt = 0 ; 
      //收到的数据动作 
   }

请享用 

________________________________
来自:安德鲁
致...
发送:2012年5月25日,星期五,2:12 AM
主题:[AVR俱乐部]使用AVR32UC3B0512处理通讯超时


 
你好

我需要能够处理项目的通讯超时。我已经读过 数据表中的相关部分,但缺少信息。

我修改了以下函数以初始化超时:

int usart_init_rs232(易失性结构avr32_usart_t * usart,结构 usart_options_t * opt,长cpu_hz)
{
内部检索

/ *重置usart并关闭RX和TX * /
usart_reset(usart);

/ *控制输入值* /
if(opt == 0)/ *空指针* /
返回USART_INVALID_INPUT;
if (选择->charlength < 5 || opt->charlength > 9)
返回USART_INVALID_INPUT;
if (选择->paritytype > 7)
返回USART_INVALID_INPUT;
if (选择->stopbits > 2+255)
返回USART_INVALID_INPUT;
if (选择->channelmode > 3)
返回USART_INVALID_INPUT;

如果((retval = usart_set_baudrate(usart,opt->波特率,cpu_hz))!= \
USART_SUCCESS)
返回retval;

if (选择->charlength == 9) {
/ *字符长度设置为9位; MODE9支配CHRL * /
usart->mr |= (1< } 其他 {
/ *当USART_MODE9 = 0时CHRL给出charlength(-5)* /
usart->mr |=
((选择->charlength-5) <<AVR32_USART_MR_CHRL_OFFSET);
}

usart->mr |= (选择->channelmode <<AVR32_USART_MR_CHMODE_OFFSET)|
(选择->paritytype <<AVR32_USART_MR_PAR_OFFSET);

if (选择->stopbits > 2)
{
/ *设置两个停止位* /
usart->mr |= (2 <<AVR32_USART_MR_NBSTOP_OFFSET);
/ *由计时员提供其余时间* /
usart->ttgr = (选择->stopbits-2);
}
其他
/ *插入1、1.5或2个停止位* /
usart->mr |= (选择->stopbits <<AVR32_USART_MR_NBSTOP_OFFSET);

/ *设置完成;启用通讯* /
/ *启用输入和输出* /
usart->cr |= (1< (1<
//设置超时值
usart->rtor = 0x1FFFF;
//启用超时
usart->cr |= (1<
返回USART_SUCCESS;
}

我修改了usart_read_char()以处理超时:

int usart_read_char(易失性结构avr32_usart_t * usart,int * c)
{
/ *检查错误;帧,奇偶校验和超限在RS485模式下为奇偶校验
错误将表示我们收到了一个地址char * /
如果(我们->csr &
((1<<AVR32_USART_CSR_OVRE_OFFSET)|
(1 <<AVR32_USART_CSR_FRAME_OFFSET)|
(1 <<AVR32_USART_CSR_PARE_OFFSET))){

返回USART_RX_ERROR;
}

否则((>csr & (1 <<AVR32_USART_CSR_TIMEOUT)){
usart->cr |= (1< usart->cr |= (1< 返回USART_RX_ERROR;
}
/ *没有错误;如果我们确实收到了一个字符,请阅读并返回成功* /
否则((>csr & (1< * c =(无符号短)usart->rhr;
usart->cr |= (1<
返回USART_SUCCESS;
}其他{
返回USART_RX_EMPTY;
}
} / * usart_read * /

当超时发生时,它被检测到,但是usart似乎崩溃了。我可以 监视微控制器与它正在通信的设备之间的通信 与,我可以看到微发送正确的命令,另一个 设备返回正确的信息,但usart仅生成通讯 错误,因此我无法读取任何有效数据。

有人可以给我一些如何处理通讯超时的提示吗 AVR32,以及如何重置usart使其不返回伪字符 subsequent reads.

提前致谢

安德鲁