main.c
/****************************************************************************/
/* */
/* Copyright (c) 2016, 老马工作室 */
/* All rights reserved. */
/* */
/* Email:pcwebmaster@163.com */
/****************************************************************************/
/****************************************************************************/
/* 文 件 名:comint.c */
/* 版 本:Version 1.0 */
/* 描 述:串行口中断带通讯协议测试 */
/* 主控芯片:MSP430G2553 */
/* 晶振频率:内部1MHz */
/* 编译环境:CCS5.4 Grace初始化 */
/* 作 者:pcwebmaster(北极狼) */
/* 函 数: */
/* system_init */
/* com_send_command */
/* com_command_receive */
/* CalCRC16_1021 */
/* command_decoder */
/* send_command */
/* 测 试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
/* 测试现象: */
/* 历史记录:20016.02.23测试通过 */
/* 北极狼 20016-02-23 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <msp430.h>
/* ======== Grace related includes ======== */
#include <ti/mcu/msp430/Grace.h>
unsigned char *str = "Hello World!\n\r Serial test normal!\n\r";
unsigned char *str1= "串口测试正常!\n\r";
/* ======== main ======== */
int main(void)
{
Grace_init(); // Activate Grace-generated configuration
buff_init();
// >>>>> Fill-in user code here <<<<<
Send_String(str);//测试
Send_String(str1);//测试
while(1)
{
com_command_receive();
}
return (0);
}
Comint.c
/****************************************************************************/
/* */
/* Copyright (c) 2016, 老马工作室 */
/* All rights reserved. */
/* */
/* Email:pcwebmaster@163.com */
/****************************************************************************/
/****************************************************************************/
/* 文 件 名:comint.c */
/* 版 本:Version 1.0 */
/* 描 述:串行口中断带通讯协议测试 */
/* 主控芯片:MSP430G2553 */
/* 晶振频率:内部1MHz */
/* 编译环境:CCS5.4 Grace初始化 */
/* 作 者:pcwebmaster(北极狼) */
/* 函 数: */
/* system_init */
/* com_send_command */
/* com_command_receive */
/* CalCRC16_1021 */
/* command_decoder */
/* send_command */
/* 测 试: 发送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
/* 测试现象: */
/* 历史记录:20016.02.23测试通过 */
/* 北极狼 20016-02-23 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <msp430.h>
#include <ti/mcu/msp430/Grace.h>
#include "comint.h"
uint8_t pint_buf[MAX_RINTL]; /* 串口接收缓冲区 */
uint8_t pint_read; /* 串口缓冲区读指针 */
uint8_t pint_write; /* 串口缓冲区写指针 */
//uint8_t psend_int; /* 串口发送允许标志 */
uint8_t serial_flag = 0; /* 串口接收数据标志位 */
uint8_t prec_buf[MAX_COMMAND_LEN]; /* 命令接收缓冲区 */
uint8_t prec_num; /* 命令接收缓冲区字节数 */
uint8_t serial_lengthl = 0; /* 消息命令长度低8位 */
uint16_t serial_length = 0; /* 消息命令长度16位 */
uint8_t ADDRESS[2]={ZU,ZHAN}; /* byte0:通讯组地址, byte1:站地址 */
//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void USCI_A0_graceInit(void)
{
/* USER CODE START (section: USCI_A0_graceInit_prologue) */
/* User initialization code */
/* USER CODE END (section: USCI_A0_graceInit_prologue) */
/* Disable USCI */
UCA0CTL1 |= UCSWRST;
/*
* Control Register 1
*
* UCSSEL_2 -- SMCLK
* ~UCRXEIE -- Erroneous characters rejected and UCAxRXIFG is not set
* ~UCBRKIE -- Received break characters do not set UCAxRXIFG
* ~UCDORM -- Not dormant. All received characters will set UCAxRXIFG
* ~UCTXADDR -- Next frame transmitted is data
* ~UCTXBRK -- Next frame transmitted is not a break
* UCSWRST -- Enabled. USCI logic held in reset state
*
* Note: ~<BIT> indicates that <BIT> has value zero
*/
UCA0CTL1 = UCSSEL_2 | UCSWRST;
/*
* Modulation Control Register
*
* UCBRF_0 -- First stage 0
* UCBRS_1 -- Second stage 1
* ~UCOS16 -- Disabled
*
* Note: ~UCOS16 indicates that UCOS16 has value zero
*/
UCA0MCTL = UCBRF_0 | UCBRS_1;
/* Baud rate control register 0 */
UCA0BR0 = 104;
/* Enable USCI */
UCA0CTL1 &= ~UCSWRST;
/* USER CODE START (section: USCI_A0_graceInit_epilogue) */
/* User code */
/* USER CODE END (section: USCI_A0_graceInit_epilogue) */
}
//-----------------------------------------------------------------
// 串口发送一个字节
//-----------------------------------------------------------------
void com_send_command(char Onebyte)
{
UCA0TXBUF = Onebyte;
__delay_cycles(2000);//发送汉字参数2000,发送字符参数为1000
}
//------------------------------------------------------------------
// 串口接收中断程序
//------------------------------------------------------------------
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR_HOOK(void)
{
uint8_t temp;
uint8_t temp1;
// USER CODE START (section: USCI0RX_ISR_HOOK)
// replace this comment with your code
// USER CODE END (section: USCI0RX_ISR_HOOK)
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
//判断串口的发送是否正在工作,
//因为要使用发送功能,所以得判断发送是否忙碌,
//只有在不忙碌的时候才可以启用发送。
//这一句就是判断发送是否在工作,如果是在工作,那么一直等待到不工作为止。
temp1 = UCA0RXBUF; //读取数据 // TX -> RXed character
temp = pint_write + 1; /* 判断是否可以写入 */
if (temp == MAX_RINTL)
{
temp=0;
}
if (temp != pint_read)
{
pint_buf[pint_write] = temp1; /* 读取数据 */
pint_write = temp;
}
}
void buff_init(void)
{
uint8_t loop;
loop = UCA0RXBUF; /* 清串口缓冲区 */
for (loop=0; loop<MAX_RINTL; loop++)
{
pint_buf[loop] = 0;
}
}
Comint.h
#ifndef __COMINT_H__
#define __COMINT_H__
#include <stdio.h>
#include <msp430.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define uint8_t unsigned char
#define u_short unsigned int
#define uint16_t unsigned int
#define ZU 0x01 /*组地址*///通讯地址修改这两项
#define ZHAN 0x02 /*站地址*///通讯地址修改这两项
#define MAX_RINTL 16 /* 串口接收缓冲区长度 */
#define SYN 0x16 /* 通讯同步位*/
#define STX 0x02 /* 通讯起始位*/
#define ETX 0x03 /* 通讯结束位*/
#define ACK 0x06
#define NAK 0x15
#define MSG_ACK 2 /* 正确应答信息 */
#define MSG_NAK 3 /* 错误应答信息 */
#define MAX_COMMAND_LEN 16 /* 串口接受命令长度 */
extern uint8_t pint_read; // 串口缓冲区读指针 */
extern uint8_t pint_write; // 串口缓冲区写指针
extern uint8_t pint_buf[MAX_RINTL]; // 串口接收缓冲区
extern uint8_t serial_flag; /* 串口接收数据标志位 */
extern uint8_t prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区 */
/* 串口初始化*/
void Serial_port_init(void);
/* 串口发送一个字节 */
void com_send_command(char Onebyte);
void Send_String(char *str);// 向PC机发送字符串
/* 串口接收数据处理 */
void com_command_receive(void);
/* 串口接收初始化 */
void buff_init(void);
///* 串口接收一字节数据 */
//unsigned char UartReadChar(void); //reentrant
/*计算CRC校验和使用MTT(0X1021)
参数:
pBuff 为需计算CRC的缓冲区的头指针
BufferLen 缓冲区长度(以字节计)
*/
u_short CalCRC16_1021(uint8_t x[], u_short BufferLen);
/* 命令解码子程序 */
void command_decoder(void);
/* 向主机发送消息帧,入口参数:消息类型 */
void send_command(uint8_t command);
#endif