4735|5

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】关于149的串口问题(就快疯了,大家请帮忙啊) [复制链接]

最近在调试F149的串口,快郁闷的不行了!

系统:F149 串口1,通信芯片MAX3485 收发数据均为查讯方式 9600Bps

工具:串口调试器

测试方式1:不停的向串口调试器发送数据,收到的数据没问题!

测试方式2:先向串口调试器发送数据,然后串口调试器向下发数据,149收到数据后,发回给串口调试器!

现象:如果单字节的发送接收数据,没有任何问题,不错也不丢包!
如果超过一个字节(我用的是8个字节),
从串口调试器看到:1) 数据丢包,下位机不是总能收到数据!
2) 帧错位,八个字节的数据错位了,也就是说前一帧的后部分数据和后一帧 的前部分数重组成新的数据帧!
3)如果错位,大部分的可以在10帧内校正回来!

现在公司那边老催,我调了两天了,都快疯了!论坛的关于串口的帖子我看到的差不多了,菏?问题相似的不多,相似的后来都说解决了,也不知道是咋解决的!
请大家帮忙吧!我不知道该咋办了!

拟解决方案:1)改为中断接收,但效果不明显,问题还在!
2)提高主频,降低传送波特率,。。。。。。
我快不行了,求救!

最新回复

void clock_initiate( void ) {         /***************************************************************************\         * first shut up watchdog programme, because this will change WDT's clock source!         * watchdog's clock source is SMCLK, SMCLK's source may be DCO or XT2.         * current operation change SMCLK's source from DCO to XT2         \***************************************************************************/         WDTCTL = WDTPW + WDTHOLD; // close watchdog                   BCSCTL1 &= 0x07F; //open xt2 clock.           BCSCTL1 &= 0x07F; //open xt2 clock.           BCSCTL1 &= 0x07F; //open xt2 clock.         BCSCTL2 = 0; // clear flag                 // 4M ?§??4????         if ( Oscillistor_4M_Or_8M )                   BCSCTL2 |= 0x00C; // set xt2 clock as the source of SMCLK ,4 divide xt2.                           // 8M ?§??8????         else                 BCSCTL2 |= 0x00E; // set xt2 clock as the source of SMCLK ,8 divide xt2.         //BCSCTL2 |=0x090; // select XT2 2 divided as MCLK source                 ××oid_mad_jump ( );         ××oid_mad_jump ( );         delay ( 500 ); // wait this clock sta××e         refresh_watchdog ( ); // re open watchdog function                   return;                                  } 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 void baudrate_set ( void ) {                 refresh_watchdog ( );        U1BR1 = 0; // adjust register setup 1M           U1BR0 = 0x06D;           U1MCTL = 0x03;                   //U1BR1 = 0; // adjust register setup 1M           //U1BR0 = 0x0DA;           //U1MCTL = 0x055;           UCTL1 |= SWRST;  //reset flag           UCTL1 |= CHAR;  // not h××e PEV, 1 bit stop, 8 bit char           U1TCTL|= ( BIT4 +  BIT5 );  // choose SMCLK as the source of communication clock           ME2 |=  ( UTXE1 + URXE1 ); //interrupt register setup           /////////////////////////////////////////         IE2 |= URXIE1;                        // Ena××e USART1 RX interrupt //////////////////////////////////////////////         UCTL1 &= ~SWRST;//ena××e  all setup                     P3SEL |= 0x0C0; //TXD RXD setup         P3DIR |= 0x040; //TXD         P3DIR &= ~( 0x080 ); //RXD         delay ( 20 );         // SCDE at P6^7           P6DIR |= BIT7;         P6OUT &= ~BIT7; // default status is receive mode                   delay ( 20 );           IFG2 &= ~( UTXIFG1 + URXIFG1 ); //clear the Interrupt Flag                        _EINT ( ); // main interrupt ena××e           delay ( 20 );           return; } void serial_initiate ( void ) {         clock_initiate( );                 baudrate_set ( );         delay ( 100 );         return; } /********************************************************\ void transmit_mode ( void ) {         refresh_watchdog ( );         // SCDE at P6^7           P6OUT |= BIT7;         P6OUT |= BIT7;           P6OUT |= BIT7;         P6OUT |= BIT7;                   delay ( 100 );                   return; } void receive_mode ( void ) {         refresh_watchdog ( );           // SCDE at P6^7            P6OUT &= ~BIT7;          P6OUT &= ~BIT7;          P6OUT &= ~BIT7;          P6OUT &= ~BIT7;          P6OUT &= ~BIT7;          P6OUT &= ~BIT7;                    delay ( 50 );                   return; } /************************************************\ void transmit_char ( unsigned char CharBeSended ) {                unsigned char i;         unsigned int TimeOutFlag;                 refresh_watchdog ( ); // re_start watchdog                 TXBUF1 = CharBeSended;                 //for ( i = 0; i < 10; i++  ) {                 for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {                         refresh_watchdog ( );                         if ( ( IFG2 & UTXIFG1 )) {                                   IFG2 &= ~ ( UTXIFG1 ); //clear the Interrupt Flag                                 return ;                                 }                                                         }                                             return; } \************************/ void transmit_string ( unsigned char *String, unsigned char Length ) {         unsigned char i;           transmit_mode ( );                 //delay ( 50 );                   for ( i = 0; i < Length; i++ )                   transmit_char ( String );           delay ( 100 );             return; } /*************************\ * Function : receive char \*************************/ // UART1 RX ISR #pragma vector=UART1RX_VECTOR __interrupt void usart1_rx (void) {         IE2 &= ~URXIE1;                    DispArray[ReceiveNumFlag] = RXBUF1;         ReceiveNumFlag++;                   IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag                 IE2 |= URXIE1;            CheckOrOper = 1; // multi use this variant                 return ; } unsigned char  receive_char ( void ) {         unsigned char DataReceived;         unsigned char i;         unsigned int TimeOutFlag;         for ( i = 0; i < 10; i++  ) {                 for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {                         refresh_watchdog ( );                         if ( ( IFG2 & URXIFG1 )) {                                 DataReceived = RXBUF1;                                           IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag                                 return ( DataReceived );                                 }                         }                                 }           return ( 0x0FF );         } /************************\ void   receive_string ( unsigned char *String, unsigned char Length ) {         unsigned char i;                 unsigned int TimeOutFlag;         ReceiveNumFlag = 0;          IE2 |= URXIE1;                       receive_mode ( );         // detect lost package           for ( ; ReceiveNumFlag < Length; ) {                                 CheckOrOper = 0;                                 for ( i = 0; ( i < 10 )&& (!CheckOrOper ); i++  ) {                         for ( TimeOutFlag = 0x0FFFF; ( TimeOutFlag > 1 )&&( !CheckOrOper ); TimeOutFlag -- )                                 refresh_watchdog ( );                         }                                 if ( i >= 10) {                                                 IE2 &= ~URXIE1;  // close interruption                         DispArray[0] = 0; // error flag                         DispArray[7] = 0; // error flag                         delay ( 20000 ); // ××oid collide                         ReceiveNumFlag = Length + 2; // force jump out                         break; // lost package processing                                                 }                                         }         refresh_watchdog ( );                 CheckOrOper = 0;                IE2 &= ~URXIE1;                    for ( i = 0; i < Length ; i ++ ){                    String [ i ] = ( unsigned char ) DispArray;                 }                   //delay ( 100 );                          return ; } 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 主要问题就是成帧数据的接收问题! 这是我的程序,后来测试查寻接收,比中断接收效果要好一点,在5帧内大都可以调整过来! 中断接收设置了一些全局变量 查寻接收就不用了,下面的是查寻接收程序! 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 unsigned char  receive_char ( void ) {         unsigned char DataReceived;         unsigned char i;         unsigned int TimeOutFlag;         refresh_watchdog ( ); // re_start watchdog         for ( i = 0; i < 10; i++  ) {                 for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {                         refresh_watchdog ( );                         if ( ( IFG2 & URXIFG1 )) {                                 DataReceived = RXBUF1;                                           IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag                                 return ( DataReceived );                                 }                         }                                 }           return ( 0x0FF );         } /************************\ * Function : receive string \************************/ void   receive_string ( unsigned char *String, unsigned char Length ) {         unsigned char i;         unsigned char ReceivedData;           receive_mode ( );                   for ( i = 0; i < Length; i++ ) {                 ReceivedData =  ( unsigned char ) receive_char ( );                                 if ( ReceivedData == 0x0FF ) {                         String [ 0 ] = 0;                         return;                         }                                            String [ i ] = ReceivedData;                                     }                   return ; }  详情 回复 发表于 2004-12-3 17:14
 
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我也碰到过类似的问题!现在解决了!看一下你的程序!
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我没有发现过这些问题,可能你的串口设置有问题,
用串口精灵看看,能帮你
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的波特率使用多高频率生成的,用方案2试一下吧
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

6
 
void clock_initiate( void )
{
/***************************************************************************\
* first shut up watchdog programme, because this will change WDT's clock source!
* watchdog's clock source is SMCLK, SMCLK's source may be DCO or XT2.
* current operation change SMCLK's source from DCO to XT2
\***************************************************************************/

WDTCTL = WDTPW + WDTHOLD; // close watchdog

BCSCTL1 &= 0x07F; //open xt2 clock.
BCSCTL1 &= 0x07F; //open xt2 clock.
BCSCTL1 &= 0x07F; //open xt2 clock.


BCSCTL2 = 0; // clear flag

// 4M ?§??4????
if ( Oscillistor_4M_Or_8M )
BCSCTL2 |= 0x00C; // set xt2 clock as the source of SMCLK ,4 divide xt2.

// 8M ?§??8????
else
BCSCTL2 |= 0x00E; // set xt2 clock as the source of SMCLK ,8 divide xt2.

//BCSCTL2 |=0x090; // select XT2 2 divided as MCLK source

××oid_mad_jump ( );
××oid_mad_jump ( );

delay ( 500 ); // wait this clock sta××e
refresh_watchdog ( ); // re open watchdog function

return;
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
void baudrate_set ( void )
{

refresh_watchdog ( );

U1BR1 = 0; // adjust register setup 1M
U1BR0 = 0x06D;
U1MCTL = 0x03;

//U1BR1 = 0; // adjust register setup 1M
//U1BR0 = 0x0DA;
//U1MCTL = 0x055;


UCTL1 |= SWRST; //reset flag
UCTL1 |= CHAR; // not h××e PEV, 1 bit stop, 8 bit char
U1TCTL|= ( BIT4 + BIT5 ); // choose SMCLK as the source of communication clock
ME2 |= ( UTXE1 + URXE1 ); //interrupt register setup

/////////////////////////////////////////
IE2 |= URXIE1; // Ena××e USART1 RX interrupt
//////////////////////////////////////////////

UCTL1 &= ~SWRST;//ena××e all setup

P3SEL |= 0x0C0; //TXD RXD setup
P3DIR |= 0x040; //TXD
P3DIR &= ~( 0x080 ); //RXD
delay ( 20 );

// SCDE at P6^7
P6DIR |= BIT7;
P6OUT &= ~BIT7; // default status is receive mode

delay ( 20 );
IFG2 &= ~( UTXIFG1 + URXIFG1 ); //clear the Interrupt Flag



_EINT ( ); // main interrupt ena××e

delay ( 20 );
return;
}


void serial_initiate ( void )
{
clock_initiate( );

baudrate_set ( );

delay ( 100 );
return;
}

/********************************************************\
void transmit_mode ( void )
{

refresh_watchdog ( );

// SCDE at P6^7
P6OUT |= BIT7;
P6OUT |= BIT7;
P6OUT |= BIT7;
P6OUT |= BIT7;


delay ( 100 );

return;
}

void receive_mode ( void )
{

refresh_watchdog ( );

// SCDE at P6^7
P6OUT &= ~BIT7;
P6OUT &= ~BIT7;
P6OUT &= ~BIT7;
P6OUT &= ~BIT7;
P6OUT &= ~BIT7;
P6OUT &= ~BIT7;

delay ( 50 );

return;
}

/************************************************\
void transmit_char ( unsigned char CharBeSended )
{
unsigned char i;
unsigned int TimeOutFlag;

refresh_watchdog ( ); // re_start watchdog

TXBUF1 = CharBeSended;

//for ( i = 0; i < 10; i++ ) {

for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {

refresh_watchdog ( );

if ( ( IFG2 & UTXIFG1 )) {

IFG2 &= ~ ( UTXIFG1 ); //clear the Interrupt Flag

return ;

}

}

return;
}

\************************/
void transmit_string ( unsigned char *String, unsigned char Length )
{
unsigned char i;

transmit_mode ( );

//delay ( 50 );

for ( i = 0; i < Length; i++ )
transmit_char ( String [i] );

delay ( 100 );
return;
}

/*************************\
* Function : receive char
\*************************/
// UART1 RX ISR
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
IE2 &= ~URXIE1;

DispArray[ReceiveNumFlag] = RXBUF1;

ReceiveNumFlag++;

IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag

IE2 |= URXIE1;

CheckOrOper = 1; // multi use this variant

return ;

}

unsigned char receive_char ( void )
{
unsigned char DataReceived;
unsigned char i;
unsigned int TimeOutFlag;

for ( i = 0; i < 10; i++ ) {

for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {

refresh_watchdog ( );

if ( ( IFG2 & URXIFG1 )) {

DataReceived = RXBUF1;

IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag

return ( DataReceived );

}

}

}

return ( 0x0FF );

}

/************************\
void receive_string ( unsigned char *String, unsigned char Length )
{
unsigned char i;

unsigned int TimeOutFlag;

ReceiveNumFlag = 0;

IE2 |= URXIE1;

receive_mode ( );

// detect lost package
for ( ; ReceiveNumFlag < Length; ) {

CheckOrOper = 0;

for ( i = 0; ( i < 10 )&& (!CheckOrOper ); i++ ) {

for ( TimeOutFlag = 0x0FFFF; ( TimeOutFlag > 1 )&&( !CheckOrOper ); TimeOutFlag -- )
refresh_watchdog ( );

}

if ( i >= 10) {

IE2 &= ~URXIE1; // close interruption
DispArray[0] = 0; // error flag
DispArray[7] = 0; // error flag

delay ( 20000 ); // ××oid collide
ReceiveNumFlag = Length + 2; // force jump out
break; // lost package processing

}

}

refresh_watchdog ( );

CheckOrOper = 0;
IE2 &= ~URXIE1;

for ( i = 0; i < Length ; i ++ ){
String [ i ] = ( unsigned char ) DispArray[i];
}


//delay ( 100 );

return ;
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
主要问题就是成帧数据的接收问题!

这是我的程序,后来测试查寻接收,比中断接收效果要好一点,在5帧内大都可以调整过来!
中断接收设置了一些全局变量
查寻接收就不用了,下面的是查寻接收程序!

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
unsigned char receive_char ( void )
{
unsigned char DataReceived;
unsigned char i;
unsigned int TimeOutFlag;

refresh_watchdog ( ); // re_start watchdog

for ( i = 0; i < 10; i++ ) {

for( TimeOutFlag = 0x0FFFF; TimeOutFlag > 1; TimeOutFlag -- ) {

refresh_watchdog ( );

if ( ( IFG2 & URXIFG1 )) {

DataReceived = RXBUF1;

IFG2 &= ~ ( URXIFG1 ); //clear the Interrupt Flag

return ( DataReceived );

}

}

}


return ( 0x0FF );

}

/************************\
* Function : receive string
\************************/
void receive_string ( unsigned char *String, unsigned char Length )
{
unsigned char i;
unsigned char ReceivedData;

receive_mode ( );

for ( i = 0; i < Length; i++ ) {

ReceivedData = ( unsigned char ) receive_char ( );

if ( ReceivedData == 0x0FF ) {

String [ 0 ] = 0;
return;

}

String [ i ] = ReceivedData;

}

return ;
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表