6989|16

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机串口通讯 [复制链接]

发送代码


  1. #include "msp430x14x.h"
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define URXD1 BIT7
  5. #define UTXD1 BIT6

  6. uchar dataSedBuffer[100]={"123"}; //发送数据缓存区
  7. uchar redySedLen = 4;             //准备发送的数据的总长度,包括'\0'
  8. uchar curtSedLen = 0;             //当前已经发送的数据的长度

  9. void Delay_us(uint count)
  10. {
  11.   while(count-- ){_NOP();_NOP();_NOP();}
  12. }

  13. void Init_clk()
  14. {
  15.   uchar i;
  16.   
  17.   WDTCTL = WDTPW +WDTHOLD;
  18.   BCSCTL1 &= ~XT2OFF;       //8MHz
  19.   BCSCTL2 &= SELM1 +SELS;
  20.   do
  21.   {
  22.     IFG1 &= ~OFIFG;
  23.     for(i=0;i<100;i++);
  24.   }while((IFG1 & OFIFG)!=0);
  25.   IFG1 &= ~OFIFG;
  26. }

  27. void Init_usart()
  28. {
  29.   U1CTL = SWRST;
  30.   U1CTL |= CHAR;          //8位数据
  31.   U1TCTL |= SSEL1;        //时钟SMCLK
  32.   U1BR0 = 0x45;
  33.   U1BR1 = 0x00;           //波特率115200
  34.   U1MCTL = 0x00;          //小数不设置
  35.   ME2 |= UTXE1;           //使能UART1的发送
  36.   U1CTL &= ~SWRST;
  37.   P3SEL |= UTXD1;    //端口功能设置为第二功能
  38. }
  39. void main()
  40. {
  41.   Init_clk();
  42.   Init_usart();
  43.   while(1)
  44.   {
  45.     U1TXBUF = dataSedBuffer[curtSedLen];
  46.     if(curtSedLen >= redySedLen)
  47.     {
  48.       curtSedLen = 0;
  49.       Delay_us(60000);
  50.     }
  51.     while((IFG2 & UTXIFG1)==0);
  52.   }
  53. }
复制代码


MSP430单片机。
程序一直卡死在    while((IFG2 & UTXIFG1)==0);这一句。数据不能发送出去。

下面是接收代码

  1. #include "msp430x14x.h"
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define URXD1 BIT7

  5. uchar dataRecBuffer[100];         //接收数据缓存区
  6. uchar saveRecLen = 0;             //最后存储收到数据的总长度
  7. uchar curtRecLen = 0;             //当前收到的数据长度

  8. void Delay_us(uint count)
  9. {
  10.   while(count-- ){_NOP();};
  11. }

  12. void Init_clk()
  13. {
  14.   uchar i;
  15.   
  16.   WDTCTL = WDTPW +WDTHOLD;
  17.   BCSCTL1 &= ~XT2OFF;        //8MHz
  18.   BCSCTL2 &= SELM1 +SELS;
  19.   do
  20.   {
  21.     IFG1 &= ~OFIFG;
  22.     for(i=0;i<100;i++);
  23.   }while((IFG1 & OFIFG)!=0);
  24.   IFG1 &= ~OFIFG;
  25. }

  26. void Init_usart()
  27. {
  28.   U1CTL = SWRST;
  29.   U1CTL |= CHAR;          //8位数据
  30.   U1TCTL |= SSEL1;        //时钟SMCLK
  31.   U1BR0 = 0x45;
  32.   U1BR1 = 0x00;           //波特率115200
  33.   U1MCTL = 0x00;          //小数设置
  34.   ME2 |= URXE1;           //使能UART1的发送和接收
  35.   U1CTL &= ~SWRST;
  36.   IE2 |= URXIE1;          //UART1接收中断使能
  37.   P3SEL |= URXD1;    //端口功能设置为第二功能
  38. }

  39. #pragma vector = UART1RX_VECTOR
  40. __interrupt void UART1_RX_ISR(void)
  41. {
  42.   dataRecBuffer[curtRecLen] = RXBUF1;           //接收数据
  43.   curtRecLen += 1;
  44.   if(dataRecBuffer[curtRecLen-1] == 13 ||dataRecBuffer[curtRecLen-1] == 0)         //接收到ENTER(换行)符
  45.   {
  46.     saveRecLen = curtRecLen-1;                    //保存收到的总长度
  47.     curtRecLen = 0;
  48.   }
  49. }

  50. void main()
  51. {
  52.   Init_clk();
  53.   Init_usart();
  54.   _EINT();
  55.   while(1){};
  56. }
复制代码

程序一直卡死在while(1){};进不了中断,接收不到数据。

我做的是两个单片机串口通信,一个发送,一个接收。
帮忙看下哪儿错了,谢谢了!

最新回复

我RI,居然是因为软件环境设置错了。  详情 回复 发表于 2009-12-31 12:26
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序一直卡死在    while((IFG2 & UTXIFG1)==0);这一句。数据不能发送出去。

可能是初始化不对 也可能是硬件有问题

建议楼主 先和PC通信
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
开全局中断
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
你可以尝试下,不用中断 发送与接收数据。

首先你可以尝试:
1、一个单片机 直接按照固定的波特率,发送一段数据(比如0-9,或者0-99)
看另外一个单片机是否接收到?

2、把第一步调通后,你再进行:第一个单片机 直接按照固定的波特率,发送一段数据;之后另外一个单片机把接收的数据都发送回来?看第一个单片机是否能接收到?

3、把上面2步调通后,你的2个单片机就能相互通信; 此时你就主要调测下你中断初始化,以及中断处理函数中的数据发送与接收。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
呵呵。俺以后把毕业设计上传上来。虽然有点烂,但是对初学者有点帮助,呵呵。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
不好意思,看错.以下为参考例程,在32K晶振下波特率为2400,肯定可用,供楼主参考

  1. #include    
  2.    
  3. void Init_UART1(void);      //声明UART初始化函数   
  4. void Init_Timer_A(void);   //初始化定时器模块   
  5. #define INBUF_LEN 4 //数据长度      
  6. unsigned char UART1_RXBUF1[INBUF_LEN];     
  7. char checksum,count3;     
  8. char TX_Flag;   
  9. void send_string_com( unsigned char *str, unsigned int strlen);   
  10. void main(void)   
  11. {   
  12. WDTCTL = WDTPW + WDTHOLD ; //关闭看门狗   
  13.      
  14. Init_UART1();          //UART初始化函数   
  15.   _EINT();              //通用中断允许   
  16.   while(1)            //主循环   
  17. {     
  18.   if( TX_Flag ==1) //如果取数标志已置位,就将读到的数从串口发出      
  19.   {     
  20.     TX_Flag = 0 ; //取数标志清0      
  21.     send_string_com(UART1_RXBUF1,INBUF_LEN);   
  22.   }   
  23. }   
  24. }   
  25. void Init_UART1(void)   
  26. {   
  27.   UCTL1 &=~ SWRST;              // SWRST复位,USART允许   
  28.   UCTL1 = 0x10;                // 8位数据位,1位停止位,无校验   
  29.   UBR01 = 0x0D;                    
  30.   UBR11 = 0x00;                // 使用32KHz晶振时波特率为2400bps   
  31.   UMCTL1 = 0x6B;               // 位调整   
  32.   UTCTL1 = 0x10;                // 选定ACLK(32KHz晶振)为时钟源   
  33.   ME2 |= 0x30;                //UART发送及接收模块允许   
  34.   P3SEL = 0xC0;                // P3.6 P3.7被USART1发送模块占用   
  35.   P3DIR = 0X40;                // P3.6 输出,P3.7 输入   
  36.   IE2 |= URXIE1;               //接收中断允许   
  37.    
  38.    
  39. }   
  40.    
  41. //向串口发送一个字符      
  42. void send_char_com( unsigned char ch)     
  43. {     
  44. TXBUF1=ch;     
  45. while ((UTCTL1&0x01)==0 );     
  46.         
  47. }     
  48.    
  49. //向串口发送一个字符串,strlen为该字符串长度     
  50.    
  51. void send_string_com( unsigned char *str, unsigned int strlen)     
  52. {     
  53. unsigned int k= 0 ;     
  54. do     
  55. {     
  56. send_char_com(*(str + k));     
  57. k++;   
  58. } while (k < strlen);     
  59. }   
  60. /*****************************************************************************  
  61. USART1接收中断函数  
  62. ******************************************************************************/   
  63. #pragma vector=UART1RX_VECTOR   
  64. __interrupt void UART1(void)   
  65. {   
  66. if (URXIFG1)     
  67. {     
  68.     unsigned char ch;     
  69.     IFG2 &=~ URXIFG1 ;     
  70.     ch=RXBUF1;     
  71.       if (ch> 127 )     
  72.         {     
  73.           count3= 0 ;     
  74.          UART1_RXBUF1[count3]=ch;     
  75.           checksum= ch- 128 ;   
  76.           }     
  77.        else     
  78.         {     
  79.        count3++;     
  80.        UART1_RXBUF1[count3]=ch;     
  81.         checksum ^= ch;     
  82. if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )     
  83.   {   
  84.     TX_Flag = 1 ;   
  85. //如果串口接收的数据达到INBUF_LEN个,且校验没错,      
  86. //就置位取数标志      
  87.   }   
  88. }     
  89. }   
  90. }   
复制代码
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
我是楼主,还有个问题。
两个单片机相连,必须要将GND连接在一起共地吗?
分别接地 不行吗?

另外两个单片机通信该怎么调试?单步调试没有用。
还有上面的问题,还是没有解决掉,不知道是不能发送,还是不能接收,
help.....
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 never_ql 的回复:
我是楼主,还有个问题。
两个单片机相连,必须要将GND连接在一起共地吗?
分别接地 不行吗?

另外两个单片机通信该怎么调试?单步调试没有用。
还有上面的问题,还是没有解决掉,不知道是不能发送,还是不能接收,
help.....


首先2个MCU 通讯,严格讲,都得共地;否则2边的电平参考不一样;很容易导致信号出错。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

9
 
共地的意思是两个连接在一起,然后同时连接到地?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
    还有个问题,我这两块MCU是焊接在一块板子上。我用JTAG接口分别烧进发送和接收的程序。这样会不会出问题?
    我先烧进发送代码,在IAR软件里执行它。它是一个死循环,不停的在一定时间间隔里发送数据串。然后我将仿真器数据线拔掉,插在另外一块单片机上,将接受代码烧进去。这个接收代码就是接收那个发送代码发送出的数据。
    然后我调试接收代码,发现接收代码并没有接收到数据,因为没有触发接收中断。
    我不知道这样的操作过程有没有错误的地方?
    如果哪位朋友有空闲,帮我看看我的代码有没有问题吧。谢谢了,我快被这东西弄的没办法了
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
两块MCU是焊接在一块板子上不会出问题,1#的txd接2#的rxd,1#的rxd接2#的txd即可。
不用中断,用查询方式 发送与接收数据。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 6 楼 never_ql 的回复:
我是楼主,还有个问题。
两个单片机相连,必须要将GND连接在一起共地吗?
分别接地 不行吗?

另外两个单片机通信该怎么调试?单步调试没有用。
还有上面的问题,还是没有解决掉,不知道是不能发送,还是不能接收,
help.....



最好的办法就是拿示波器来看数据
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
两个要通信  共地是必须的
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

14
 
地电平(GND)与大地是两个概念,楼主要弄清楚.要分别接地也可以,需要用光耦隔离.
建议楼主先用PC机与其中一台通,不要一台都没搞清楚就搞联机,都不知道哪出的问题.
引用 8 楼 never_ql 的回复:
共地的意思是两个连接在一起,然后同时连接到地?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
学习
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
单片机没有串口和PC相连,我怎么弄PC和单片机的通讯?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

17
 
我RI,居然是因为软件环境设置错了。
 
 
 

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

开源项目 更多>>
    查找数据手册?

    EEWorld Datasheet 技术支持

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

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

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

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

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

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