原创MSP430中继通讯协议(源代码)

Code:
  1. //===========================================================================//
  2. //MSP430接收中继端协议——徐方鑫//
  3. //通讯协议格式为:16进制发送//
  4. //5309AAAAAAAAAAAA45//
  5. //53为数据包打头,字符's'//
  6. //09为字符串长度,char类型//
  7. //其后AAAAAA等为数据内容//
  8. //45为数据包结尾,字符'E'//
  9. //===========================================================================//
  10. #include"msp430x54x.h"
  11. #include<stdlib.h>
  12. #include<stdio.h>
  13. #include<string.h>
  14. #include"PIN_DEF.H"
  15. #defineucharunsignedchar
  16. #defineuintunsignedint
  17. #defineFLL_FACTOR749//FLL_FACTOR:DCO倍频系数
  18. #defineDATA_BAG_ERROR_MAX0x5000//最大数据包长度,int类型,串口所用8位基本都支持
  19. charevent;//待机模式事件
  20. uintData_Bag_Length,Data_Length;//Data_Bag_Leangth接收数据包的长度
  21. charRXBuffer[20];//接收缓存
  22. //***************************************************************************//
  23. ////
  24. //初始化主时钟:MCLK=XT1×(FLL_FACTOR+1)//
  25. ////
  26. //***************************************************************************//
  27. voidInit_CLK(void)
  28. {
  29. WDTCTL=WDTPW+WDTHOLD;//关看门狗
  30. P7SEL|=0x03;//端口选择外部低频晶振XT1
  31. UCSCTL6&=~XT1OFF;//使能外部晶振
  32. UCSCTL6|=XCAP_3;//设置内部负载电容
  33. UCSCTL3|=SELREF_2;//DCOref=REFO
  34. UCSCTL4|=SELA_0;//ACLK=XT1
  35. __bis_SR_register(SCG0);//关闭FLL控制回路
  36. UCSCTL0=0x0000;//设置DCOx,MODx
  37. UCSCTL1=DCORSEL_7;//设置DCO振荡范围
  38. UCSCTL2=FLLD__1+FLL_FACTOR;//Fdco=(FLL_FACTOR+1)×FLLRef=(649+1)*32768=21.2992MHz
  39. __bic_SR_register(SCG0);//打开FLL控制回路
  40. __delay_cycles(1024000);
  41. do
  42. {
  43. UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);//清除XT2,XT1,DCO错误标志
  44. SFRIFG1&=~OFIFG;
  45. }while(SFRIFG1&OFIFG);//检测振荡器错误标志
  46. }
  47. //***************************************************************************//
  48. ////
  49. //Init_Port(void):设置IO端口//
  50. ////
  51. //***************************************************************************//
  52. voidInit_Port(void)
  53. {
  54. P5DIR|=POWER;//主电源
  55. MAIN_POWER_ON;
  56. P7DIR|=LED_PWR;//发光二极管电源
  57. P7OUT&=~LED_PWR;
  58. INTERNAL_PULL_UP;//使能键盘端口内部上拉电阻
  59. ROW_IN_COL_OUT;//设置行输入,列输出0
  60. }
  61. //***************************************************************************//
  62. ////
  63. //Init_UART(void):初始化USB端口//
  64. ////
  65. //***************************************************************************//
  66. voidInit_UART(void)
  67. {
  68. USB_PORT_SEL|=TXD_U+RXD_U;//选择引脚功能
  69. USB_PORT_DIR|=TXD_U;//选择引脚功能
  70. UCA1CTL1=UCSWRST;//状态机复位
  71. UCA1CTL1|=UCSSEL_1;//CLK=ACLK
  72. UCA1BR0=0x03;//32kHz/9600=3.41
  73. UCA1BR1=0x00;
  74. UCA1MCTL=UCBRS_3+UCBRF_0;//UCBRSx=3,UCBRFx=0
  75. UCA1CTL1&=~UCSWRST;//启动状态机
  76. UCA1IE|=UCRXIE;//允许接收中断
  77. }
  78. //***************************************************************************//
  79. ////
  80. //UTX_PROC(void):USB端口发送程序//
  81. ////
  82. //***************************************************************************//
  83. voidUTX_PROC(char*tx_buf)
  84. {
  85. unsignedchari,length;
  86. length=strlen(tx_buf);
  87. for(i=0;i<length;i++)
  88. {
  89. UCA1TXBUF=*tx_buf++;
  90. //__delay_cycles(5000);
  91. while(!(UCA1IFG&UCTXIFG));
  92. }
  93. }
  94. //***************************************************************************//
  95. ////
  96. //UTX_PROC(void):USB端口发送程序//
  97. ////
  98. //***************************************************************************//
  99. voidData_Bag_Send(char*tx_buf)
  100. {
  101. unsignedchari,length_all,length;//声明数据总长度,length_all为转发数据包,length为不带转发数据包
  102. length_all=strlen(tx_buf)+Data_Length;//转发数据包为待发送数据长度+转发数据长度
  103. length=strlen(tx_buf);//length为本身数据长度,当无转发数据时从串口发送
  104. UCA1TXBUF='S';//发送启始指令'S',八进制为0x53
  105. while(!(UCA1IFG&UCTXIFG));//等待发送完成
  106. if(Data_Length<DATA_BAG_ERROR_MAX)//如果有待转发数据
  107. {
  108. UCA1TXBUF=length_all+3;//发送数据总长度
  109. while(!(UCA1IFG&UCTXIFG));//等待发送完成
  110. for(i=2;i<2+Data_Length;i++)//发送转发数据包
  111. {
  112. UCA1TXBUF=RXBuffer[i];
  113. while(!(UCA1IFG&UCTXIFG));
  114. }
  115. }
  116. else
  117. {
  118. UCA1TXBUF=length+3;//没有中继数据的时候,直接发送数据包
  119. while(!(UCA1IFG&UCTXIFG));
  120. }
  121. for(i=0;i<length;i++)
  122. {
  123. UCA1TXBUF=*tx_buf++;//发送本地数据包
  124. //__delay_cycles(5000);
  125. while(!(UCA1IFG&UCTXIFG));
  126. }
  127. UCA1TXBUF='E';//发送包尾'E'
  128. }
  129. //***************************************************************************//
  130. ////
  131. //主函数//
  132. ////
  133. //***************************************************************************//
  134. voidmain(void)
  135. {
  136. inti;
  137. WDTCTL=WDTPW+WDTHOLD;//看门狗关闭
  138. Init_CLK();//时钟初始化
  139. Init_Port();//IO端口初始化
  140. Init_UART();//串口初始化
  141. _EINT();//启动中断
  142. for(;;)
  143. {
  144. if(event)
  145. {
  146. event=0x00;
  147. UTX_PROC(RXBuffer);
  148. }
  149. if((P6IN&0x0F)!=0x0F)//检测按键按下
  150. {
  151. //UTX_PROC(Data_Bag);
  152. //UTX_PROC(RXBuffer);
  153. //UTX_PROC(&Data_Length);
  154. Data_Bag_Send("123");//本地数据包为123
  155. __delay_cycles(5000000);
  156. }
  157. }
  158. }
  159. //***************************************************************************//
  160. ////
  161. //USB接收中断服务程序//
  162. ////
  163. //***************************************************************************//
  164. #pragmavector=USCI_A1_VECTOR
  165. __interruptvoidUSCI_A1_ISR(void)
  166. {
  167. staticcharrx_byte=0x00;//接收字段初始化
  168. unsignedchartemp,event=0x00;//BUFFER空间,还有待机模式初始化
  169. switch(__even_in_range(UCA1IV,4))
  170. {
  171. case0:break;//Vector0-nointerrupt
  172. case2://Vector2-RXIFG
  173. temp=UCA1RXBUF;
  174. if(rx_byte==0)
  175. {
  176. if(temp=='S')
  177. {
  178. RXBuffer[0]=UCA1RXBUF;//如果首位为's’接收数据
  179. rx_byte++;//计数
  180. }
  181. }
  182. else
  183. {
  184. RXBuffer[rx_byte++]=temp;
  185. if(rx_byte>=RXBuffer[1])//若数据还在接收范围内部,接收数据
  186. {
  187. Data_Bag_Length=RXBuffer[1];//数据总长赋值
  188. Data_Length=Data_Bag_Length-3;//数据长赋值
  189. if(RXBuffer[rx_byte-1]=='E')//如果数据尾巴为E,保存数据
  190. {
  191. rx_byte=0x00;
  192. event|=0x01;
  193. }
  194. else//否则,在数据总长不对或者数据尾不对的情况下,删除数据
  195. {
  196. rx_byte=0x00;
  197. for(temp=0;temp<20;temp++)
  198. RXBuffer[temp]=0x00;//通讯有误,清除缓冲区
  199. }
  200. }
  201. }
  202. break;
  203. case4:break;//Vector4-TXIFG
  204. default:break;
  205. }
  206. if(event)
  207. LPM3_EXIT;//唤醒待机模式
  208. }

你可能感兴趣的:(源代码)