📄 uartcomm.c.bak
字号:
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
#include <api.h>
#include <console.h>
//#include <string.h>
//#include <ctype.h>
#define MAX_BUF_SIZE 1024
extern unsigned char gcCommMsgRow;
/*
* 断开连接
*/
void UART_disconnect()
{
typ_UART_stat_word Ustat;
// clr_scr();
// move_cursor(0,0);
// puts("UART_receive");
// getch();
Ustat.l_word = UART_stat();
if (Ustat.bits.UART_on)
{
UART_init(UART_OFF);
sys_msg(SM_GOTO_SLEEP);
}
}
/*
* calc checksun as tcp/ip checksun
*/
unsigned short cal_chksum(const void *addr, int len)
{
int nleft=len;
int sum=0;
unsigned short *w= (unsigned short *)addr;
unsigned short answer=0;
while(nleft>1)
{ sum+=*w++;
nleft-=2;
}
if( nleft==1)
{ *(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
}
/*
// delay subroutine:
void delay_n_ms(int mscnt) {
for (;mscnt > 0; mscnt--)
delay_1ms();
}
*/
// puts via UART
void UART_puts(unsigned char *buf, int len) {
for(; len > 0; len--) {
while(UART_send_char(*buf));
buf++;
}
}
/*
* 握手建立连接(当作发起端)
*/
/*
short UART_connect()
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char recBuf[MAX_BUF_SIZE];
unsigned char sendBuf[6];
unsigned short checksum=0,recLen=0;
SPT_set(64);
UART_disconnect();
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
delay_n_ms(3);
//握手数据帧: 一位的起始位: 0xBE
// 两位的长度: 0x0006
// 一位的握手数据:0xAA
// 两位的校验位
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xAA;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
SPT_set(64 );
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
{
UART_disconnect();
return 1;
}
}
//握手回复帧: 一位的起始位:0xBE
// 两位的长度:0x0001
// 一位的握手数据:0x55
// 两位的校验位
memset( (void*)recBuf, 0, sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if ( recLen == 6 )
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x55 || cal_chksum( (unsigned short *)recBuf,recLen) )
{
UART_disconnect();
return 3;
}
return 0;
}
*/
/*
* 握手建立连接(当作响应端)
*/
short UART_open()
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char recBuf[MAX_BUF_SIZE];
unsigned char sendBuf[6];
unsigned short checksum=0,recLen=0;
SPT_set(64);
UART_disconnect();
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
delay_n_ms(3);
SPT_set(64);
/*
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
{
UART_disconnect();
return 1;
}
}
memset( (void*)recBuf,0,sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if (recLen == 6)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0xAA || cal_chksum((unsigned short *)recBuf,recLen) )
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xFF;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
UART_disconnect();
return 2;
}
else
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0x00;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
return 0;
}
*/
}
/*
* 发送数据
* 参数 in: sendBuf 要发送的数据区(不包括一位开始位、2位长度位和2位校验位)
* : sendLen 要发送的数据区的长度(byte)
*
* 返回: 0 发送成功 -1 发送失败
*/
short UART_send(const void *sendBuf, unsigned short sendLen)
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char pBuf[MAX_BUF_SIZE];
unsigned char recBuf[MAX_BUF_SIZE];
unsigned short checksum=0,recLen=0;
if(sendLen + 5 > MAX_BUF_SIZE)
return -1;
Ustat.l_word = UART_stat();
if (!Ustat.bits.UART_on)
return 1;
move_cursor(0,gcCommMsgRow);
puts("发送数据...");
if(gcCommMsgRow<6)
gcCommMsgRow += 2;
else
gcCommMsgRow = 2;
pBuf[0] = 0xBE;
pBuf[1] = (sendLen+5) >> 8;
pBuf[2] = (sendLen+5) & 0xFF;
memcpy( (void *)&pBuf[3], sendBuf, sendLen );
checksum = cal_chksum( (unsigned short *)pBuf, sendLen+3);
pBuf[sendLen+3] = checksum >> 8;
pBuf[sendLen+4] = checksum & 0xFF;
UART_puts( pBuf, sendLen+5);
SPT_set(64 );
//等到确认数据到来
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
return 2;
}
memset( (void*)recBuf,0,sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if (recLen == 6)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x00 || cal_chksum((unsigned short *)recBuf,recLen) )
return 3;
return 0;
}
/*
* 接收数据
* 参数 out: sendBuf 接收到的数据区(包括一位开始位、2位长度位和2位校验位)
* : sendLen 接收到的数据区的长度(byte)
*
* 返回: 0 接收成功 -1 接收失败
*/
short UART_receive(void *recBuf, unsigned short *recLen)
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char *buf;
unsigned char sendBuf[6];
unsigned short checksum,recCount=0;
short result;
// clr_scr();
// move_cursor(0,0);
// puts("UART_receive");
// getch();
Ustat.l_word = UART_stat();
if (!Ustat.bits.UART_on)
return 1;
move_cursor(0,gcCommMsgRow);
puts("接收数据...");
if(gcCommMsgRow<6)
gcCommMsgRow += 2;
else
gcCommMsgRow = 2;
SPT_set(64); //time_out = 4s
buf = (unsigned char *)recBuf;
//等到数据到来
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
return 2;
}
//接收数据
do {
buf[recCount++] = (unsigned char)UART_get_char();
if(recCount == 1 && buf[0] != 0xBE)//丢弃不是以开始位(0xBE)开始的所有数据
recCount = 0;
//接收完了指定帧长,离开循环
else if ( recCount > 3 && recCount == ( (((unsigned short)buf[1])<<8) + buf[2] ) )
break;
else if (recCount >= MAX_BUF_SIZE)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);//否则一直接收到接收缓冲区没有数据
*recLen = recCount;
//判断数据帧的合法性,并且回应对应的数据帧
checksum = cal_chksum((void *)buf, recCount-2);
// Dispbcd(0,0,buf+recCount-2,2);
sendBuf[0] = checksum >> 8;
sendBuf[1] = checksum & 0xFF;
// Dispbcd(0,6,sendBuf,2);
if ((recCount < 6) ||(buf[0] != 0xBE)||(buf[recCount-2] != sendBuf[0])||(buf[recCount-1] != sendBuf[1]))
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xFF;//0xFF代表接收出错
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
result = 3;
}
else
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0x00;//0x00代表接收正确
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
result = 0;
}
return result;
}
/*
main(void)
{
typ_msg_word msg_buffer;
char icondata[8];
char cnt;
Disp_icon_customize(0xFF);
Disp_init(DISP_INIT_ON);
clr_scr();
for (cnt = 0; cnt < 8; cnt ++)
icondata[cnt] = 0;
Disp_icon_set((unsigned long *) icondata);
Disp_set_font_attribute(DISP_FONT_TYPE_5x7_ENG);
goto_xy(20,1);
Disp_write_str("hello world");
sm_setting(MSK_KEY_UP | MSK_KEY_DOWN);
KEY_init(KEY_BEEP_KEY | KEY_AUTO_EL_ON);
KEY_beep_mask_set(0xFFFF7FFF);
KEY_EL_mask_set(0xFFFF7FFF);
EL_set_time_out(5);
SPT_set(64);
srand(RTC_read_time());
while (1) {
char tempStr[40];
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.time_out) {
Disp_init(DISP_INIT_POWER_SAVE);
}
if (msg_buffer.bits.key_available) {
unsigned char tb;
Disp_init(DISP_INIT_ON);
SPT_set(64);
clr_win(0,0*8, 127,63);
goto_xy(0,3);
tb = KEY_read();
Disp_write_str(terminal_key_strings[key_translated(tb)]);
Disp_write_str(" is pressed");
goto_xy(0,5);
memset( (void*)tempStr,0,40);
if(tb == KEY_F1 )
{
char *p;
p = (char *)0x00070000;
sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
Disp_write_str(tempStr);
}
else if(tb == KEY_F2)
{
char *p;
p = (char *)0x000f0000;
sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
Disp_write_str(tempStr);
}
else if(tb == KEY_F3)
{
char *p;
p = (char *)0x000180000;
sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
Disp_write_str(tempStr);
}
else if(tb == KEY_ENTER)
{
sprintf(tempStr,"connect status:%d", UART_connect() );
Disp_write_str(tempStr);
}
else if(tb == KEY_CLR)
{
UART_disconnect();
sprintf(tempStr,"UART disconnect");
Disp_write_str(tempStr);
}
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -