1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ecbm-fur

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
fur.c 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
naite Отправлено 3 лет назад 83958e4
#include "fur.h"
/*--------------------------------------变量定义-----------------------------------*/
fur_buf_def fur_cmd_buf[FUR_BUF_MAX];//指令缓存。
fur8 fur_status;//接收状态机。
fur8 fur_start;//缓存的首指针。
fur8 fur_end;//缓存的尾指针。
fur8 fur_count;//用于统计接收了多少条指令。
fur8 fur_temp8;//用于接收8位数据的临时变量。
fur8 fur_id;//用于接收ID的临时变量。
fur16 fur_temp16;//用于接收16位数据的临时变量。
/*--------------------------------------程序定义-----------------------------------*/
/*-------------------------------------------------------
FUR发送数值函数,以10进制的格式发送。
-------------------------------------------------------*/
#if FUR_UART_SEND_EN
void fur_send_num_10(u16 num){
u8 a,b,c,d,e;
a=num/10000;
b=num%10000/1000;
c=num%1000/100;
d=num%100/10;
e=num%10/1;
if(a)fur_set_uart(a+'0');
if(a|b)fur_set_uart(b+'0');
if(a|b|c)fur_set_uart(c+'0');
if(a|b|c|d)fur_set_uart(d+'0');
fur_set_uart(e+'0');
}
#endif
/*-------------------------------------------------------
FUR发送数值函数,以16进制的格式发送。
-------------------------------------------------------*/
#if FUR_UART_SEND_EN
void fur_send_num_16(u16 num){
u8 i;
u16 temp16;
temp16=num;
for(i=0;i<4;i++){
switch(temp16&0xF000){
case 0x0000:{fur_set_uart('0');}break;
case 0x1000:{fur_set_uart('1');}break;
case 0x2000:{fur_set_uart('2');}break;
case 0x3000:{fur_set_uart('3');}break;
case 0x4000:{fur_set_uart('4');}break;
case 0x5000:{fur_set_uart('5');}break;
case 0x6000:{fur_set_uart('6');}break;
case 0x7000:{fur_set_uart('7');}break;
case 0x8000:{fur_set_uart('8');}break;
case 0x9000:{fur_set_uart('9');}break;
case 0xA000:{fur_set_uart('A');}break;
case 0xB000:{fur_set_uart('B');}break;
case 0xC000:{fur_set_uart('C');}break;
case 0xD000:{fur_set_uart('D');}break;
case 0xE000:{fur_set_uart('E');}break;
case 0xF000:{fur_set_uart('F');}break;
}
temp16<<=4;
}
}
#endif
/*-------------------------------------------------------
FUR寄存器操作函数。
-------------------------------------------------------*/
fur16 fur_reg_operate(u8 buf_point){
fur16 temp16,mask;
fur8 bit_mask,operate;
if((fur_cmd_buf[buf_point].status&FUR_EN)==0){
return 0;
}
temp16 =fur_data_out(fur_cmd_buf[buf_point].addr);
operate =(fur_cmd_buf[buf_point].operate)&0xF0;
bit_mask=(fur_cmd_buf[buf_point].operate)&0x0F;
switch(operate){
case FUR_READ://读寄存器。
//啥都不用做。
break;
case FUR_ADD://寄存器加上一个数。
temp16+=fur_cmd_buf[buf_point].dat;
break;
case FUR_DEC://寄存器减去一个数。
temp16-=fur_cmd_buf[buf_point].dat;
break;
case FUR_MUL://寄存器乘以一个数。
temp16*=fur_cmd_buf[buf_point].dat;
break;
case FUR_DIV://寄存器除以一个数。
temp16/=fur_cmd_buf[buf_point].dat;
break;
case FUR_AND://寄存器与上一个数。
temp16&=fur_cmd_buf[buf_point].dat;
break;
case FUR_OR://寄存器或上一个数。
temp16|=fur_cmd_buf[buf_point].dat;
break;
case FUR_XOR://寄存器异或上一个数。
temp16^=fur_cmd_buf[buf_point].dat;
break;
case FUR_BIT://寄存器位赋值。
mask=1<<bit_mask;
if(fur_cmd_buf[buf_point].dat){
temp16|=mask;
}else{
temp16&=~mask;
}
break;
case FUR_EQU://寄存器赋值。
temp16=fur_cmd_buf[buf_point].dat;
break;
}
fur_data_in(fur_cmd_buf[buf_point].addr,temp16);
fur_cmd_buf[buf_point].status|=FUR_END;
return temp16;
}
/*-------------------------------------------------------
FUR初始化函数。
-------------------------------------------------------*/
void fur_init(void){
fur_status=0;
fur_start =0;
fur_end =0;
fur_count =0;
fur_id =0;
fur_temp8 =0;
fur_temp16=0;
}
/*-------------------------------------------------------
FUR处理函数。
-------------------------------------------------------*/
void fur_deal(void){
u16 temp16;
while(fur_count){//有数据回来的时候。
if(fur_count>FUR_BUF_MAX){
fur_overflow_callback();
}
if(fur_cmd_buf[fur_start].status&FUR_FBID){
#if FUR_UART_SEND_EN
fur_set_uart('i');
fur_set_uart('d');
fur_set_uart('=');
fur_send_num_10((u16)fur_get_id());
fur_set_uart(';');
fur_set_uart('\r');
fur_set_uart('\n');
#endif
}else if(fur_cmd_buf[fur_start].status&FUR_WRITE){
temp16=fur_reg_operate(fur_start);
if(fur_cmd_buf[fur_start].status&FUR_END){
#if FUR_UART_SEND_EN
fur_set_uart('(');
fur_send_num_10(fur_cmd_buf[fur_start].addr);
fur_set_uart(')');
fur_set_uart('=');
if(fur_cmd_buf[fur_start].status&FUR_HEX){
fur_set_uart('0');
fur_set_uart('x');
fur_send_num_16(temp16);
}else{
fur_send_num_10(temp16);
}
fur_set_uart(';');
fur_set_uart('\r');
fur_set_uart('\n');
#endif
fur_start++;
if(fur_start>=FUR_BUF_MAX){//首指针操作末地址的话,
fur_start=0; //重置指针。
}
}
}
fur_count--;
}
}
/*-------------------------------------------------------
FUR检查函数。
-------------------------------------------------------*/
void fur_check(void){
if((fur_id==0)||(fur_id==fur_get_id())){//看看是不是广播帧,或者发往本机的数据帧。
fur_cmd_buf[fur_end].status|=FUR_EN;//置使能位,本条数据确实由本机来处理。
fur_end++; //尾指针+1。
if(fur_end>=FUR_BUF_MAX){ //尾指针超过末地址的话,
fur_end=0; //重置指针。
}
fur_count++; //接收数量+1。
}//不满足以上条件,说明这条数据不是操作本机,就忽略掉。
fur_status=FUR_READY; //回到就绪状态。
}
/*-------------------------------------------------------
FUR重置函数。
-------------------------------------------------------*/
void fur_reset(void){
fur_status=FUR_GET_ADDR; //重置后到接收地址状态,
fur_cmd_buf[fur_end].status=0; //清除状态,
fur_cmd_buf[fur_end].operate=0; //清除操作,
fur_cmd_buf[fur_end].addr=0; //清除地址,
fur_cmd_buf[fur_end].dat=0; //清除数据。
fur_temp16=0; //清除16位临时变量。
fur_temp8=0; //清除8位临时变量。
}
/*-------------------------------------------------------
FUR接收函数。
-------------------------------------------------------*/
void fur_receive(void){
fur8 dat;
dat=fur_get_uart();
switch(fur_status){
case FUR_READY:{ //就绪状态。
//啥也不做。
}break;
case FUR_GET_ADDR:{//接收地址状态。
if((dat>='0')&&(dat<='9')){ //如果收到的是0~9,
fur_temp16*=10; //空出一位,
fur_temp16+=(dat-'0'); //把字符转换成数字放入空出的那一位上。
}else if(dat=='@'){ //但要是接收到@,说明有ID数据。
fur_cmd_buf[fur_end].addr=fur_temp16;//保存目前接收到的地址。
fur_id=0; //ID缓存清零。
fur_status=FUR_GET_ID; //跳转到接收ID状态。
}else if(dat==']'){ //如果收到],说明地址已经接收完毕。
fur_cmd_buf[fur_end].addr=fur_temp16;//保存接收的地址。
fur_id=0; //ID缓存清零。
fur_status=FUR_GET_OP; //跳转到接收操作状态。
}else if((dat=='i')||(dat=='I')){//如果收到了小写的i,或者大写的I。
fur_id=0; //ID缓存清零。
fur_status=FUR_CMD_ID; //说明可能是查ID的指令,跳转到查ID状态。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
}break;
case FUR_CMD_ID:{//查ID状态。
if((dat=='d')||(dat=='D')){//在这个状态下,只判断是不是ID,不是就跳出去。
fur_cmd_buf[fur_end].status|=FUR_FBID;//置位查询ID。
fur_check();
}
fur_status=FUR_READY; //回到就绪状态。
}break;
case FUR_GET_ID:{//接收ID状态。
if((dat>='0')&&(dat<='9')){ //如果收到的是0~9,
fur_id*=10; //空出一位,
fur_id+=(dat-'0'); //把字符转换成数字放入空出的那一位上。
}else if(dat==']'){ //如果收到],说明ID已经接收完毕。
fur_status=FUR_GET_OP; //跳转到接收操作状态。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
}break;
case FUR_GET_OP:{//接收操作数状态。
if(dat=='+'){ //如果收到+号,
fur_cmd_buf[fur_end].operate=FUR_ADD;//执行加操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='-'){ //如果收到-号,
fur_cmd_buf[fur_end].operate=FUR_DEC;//执行减操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='*'){ //如果收到*号,
fur_cmd_buf[fur_end].operate=FUR_MUL;//执行乘操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='/'){ //如果收到/号,
fur_cmd_buf[fur_end].operate=FUR_DIV;//执行除操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='&'){ //如果收到&号,
fur_cmd_buf[fur_end].operate=FUR_AND;//执行与操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='|'){ //如果收到|号,
fur_cmd_buf[fur_end].operate=FUR_OR;//执行或操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='^'){ //如果收到^号,
fur_cmd_buf[fur_end].operate=FUR_XOR;//执行异或操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='.'){ //如果收到.号,
fur_cmd_buf[fur_end].operate=FUR_BIT;//执行位操作。
fur_status=FUR_GET_OP_EX;//跳到扩展操作状态。
}else if(dat=='='){ //如果收到=号,
fur_cmd_buf[fur_end].operate=FUR_EQU;//执行赋值操作。
fur_temp16=0; //清除16位临时变量。
fur_status=FUR_GET_DATA;//跳到接收数据状态(十进制)。
}else if(dat=='x'){ //如果在这里收到x,代表是十六进制。
fur_cmd_buf[fur_start].status|=FUR_HEX;//置位对应的标志位,但不需要跳转到其他状态。
}else if(dat=='?'){
fur_cmd_buf[fur_end].operate=FUR_READ;//执行读取操作。
fur_check(); //检查接收到的信息。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
fur_temp8=0; //清除8位临时变量。
}break;
case FUR_GET_OP_EX:{//接收扩展操作状态(目前就是接收位操作的位编号的)。
if((dat>='0')&&(dat<='9')){ //如果收到的是0~9,
fur_temp8*=10; //空出一位,
fur_temp8+=(dat-'0'); //把字符转换成数字放入空出的那一位上。
}else if(dat=='='){ //如果收到=号,
fur_cmd_buf[fur_end].operate|=(fur_temp8&0x0F);//限制该参数不能超过15,然后给操作变量。
fur_temp16=0; //清除16位临时变量。
fur_status=FUR_GET_DATA;//跳到接收数据状态(十进制)。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
}break;
case FUR_GET_DATA:{//接收数据状态(十进制)。
if((dat>='0')&&(dat<='9')){ //如果收到的是0~9,
fur_temp16*=10; //空出一位,
fur_temp16+=(dat-'0'); //把字符转换成数字放入空出的那一位上。
}else if(dat==';'){ //如果收到结束符,
fur_cmd_buf[fur_end].dat=fur_temp16;//把接收到数据保存,
fur_check(); //检查接收到的信息。
}else if((dat=='x')||(dat=='X')){//如果收到的是x,说明可能要收到16进制数。
fur_temp16=0; //清除16位临时变量。
fur_cmd_buf[fur_end].status|=FUR_HEX;//标记这次通信以16进制表示。
fur_status=FUR_GET_DATA16;//跳到接收数据状态(十六进制)。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
}break;
case FUR_GET_DATA16:{//接收数据状态(十六进制)。
if((dat>='0')&&(dat<='9')){ //如果收到的是0~9,
fur_temp16*=16; //空出4bit,
fur_temp16+=(dat-'0'); //把字符转换成数字放入空出的位上。
}else if((dat>='a')&&(dat<='f')){//如果收到的是小写的字母,
fur_temp16*=16;
fur_temp16+=(dat-'a'+10);//和上面一样都是转化字符。
}else if((dat>='A')&&(dat<='F')){//如果收到的是大写的字母,
fur_temp16*=16;
fur_temp16+=(dat-'A'+10);//和上面一样都是转化字符。
}else if(dat==';'){ //如果收到结束符,
fur_cmd_buf[fur_end].dat=fur_temp16;//把接收到数据保存,
fur_check(); //检查接收到的信息。
}else{ //如果是收到其他字符,说明接收出错了。
fur_status=FUR_READY; //回到就绪状态。
}
}break;
}
if(dat=='['){ //任何时候如果收到了开始标记[,
fur_reset(); //就得先重置fur,
fur_cmd_buf[fur_end].status|=FUR_WRITE; //再打上写入标志。
}else if(dat=='('){ //如果是收到回复标记(,
fur_reset(); //只重置fur。
}
}

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/ecbm-fur.git
git@gitlife.ru:oschina-mirror/ecbm-fur.git
oschina-mirror
ecbm-fur
ecbm-fur
master