C#通过串口控制led显示 5C

有谁有用C#写的串口通信程序的源代码,就像串口调试助手那种软件,用PC通过串口来控制液晶显示模块?

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# serport 与 stc80c51 单片机通信
用c#的serpoet类与51单片机通信 为什么收到的数据是错误的。 下位机代码#include<lcd.h> #include<duoji.h> #define uchar unsigned char #define uint unsigned int uint flag; uchar a; char receve[5],i=0; uint num; float angle; char table[10]="0123456789"; sbit led=P2^0; void chuankouinit() { TMOD=0x20; TH1=0xfd; TL1=0Xfd; TR1=1; REN=1; SM0=1; SM1=1; EA=1; ES=1; } /*--------------------------------------------------------------- 主函数 ----------------------------------------------------------------*/ void display(uint a,float b) { uint c; uchar d; d=' ' ; c=(int)b; LcdWriteData(table[a/10]); //lcd1602显示收到的第一个数 2位 delayms(5); LcdWriteData(table[a%10]); delayms(5); LcdWriteData(d); LcdWriteData(table[c/100]); //lcd1602显示收到的第2个数 3位 delayms(5); c%=100; LcdWriteData(table[c/10]); delayms(5); LcdWriteData(table[c%10]); delayms(5); } void datareceive() { int j; if(flag==1) { led=0; flag=0; angle=receve[0]; //第一个数 num=receve[1]; //第二个数 LcdWriteCom(0x80); display(num,angle); //LCD显示 for(j=0;j<5;j++) { receve[j]=0; } } } void main() { chuankouinit(); LcdInit(); I2Cinit(); begin(); setPWMFreq(); setPWM(0,0, 0) ; while(1) { datareceive(); } } void ser() interrupt 4 { RI=0; receve[i]=SBUF; i++; if(i==2) { i=0; flag=1; } } 上位机代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.Threading; namespace 串口App1 { public class PortChat { static SerialPort _serialPort; public static void Main() { byte[] b = new byte[2]; b[0] = 100; b[1] = 200; Console.Write("b[1] {0}", b[1]); // Create a new SerialPort object with default settings. _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _serialPort.Write(b,0,2); Console.Write(" message已发送 "); _serialPort.Close(); Console.ReadKey(); } } }
Arduino接收串口命令的函数,在PC端分别发送字符”A”,”B”,”C”能够控制LED显示三种不同亮度?
在运行的时候,串口输入a,b,c,led灯一直亮,没有变化 ``` #define LED_PIN 1 void setup() { Serial.begin(9600); pinMode(1, OUTPUT); } void loop() { while (Serial.available()) { char abc = Serial.read(); if(abc == 'a'){ Serial.println("ledLevel=10"); analogWrite(1, 10); delay(2000); } if(abc == 'b'){ Serial.println("ledLevel=100"); analogWrite(1, 100); delay(2000); } if(abc == 'c'){ Serial.println("ledLevel=200"); analogWrite(1, 200); delay(2000); } } } ``` ![图片说明](https://img-ask.csdn.net/upload/201905/02/1556761935_700463.png)
小白学习写51单片机串口通信控制led闪烁频率,死循环了怎么破?
额,想用while写小灯循环,可是发现这样写直接进死循环了,没有返回值,也就改变不了频率了。求助求助 ```#include<reg52.h> #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; u8 i; sbit led=P0^0; void delay(u16 a) { while(a--); } void UsartInit() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0XF3; ES=1; EA=1; TR1=1; } void Uart() interrupt 4 { u8 receiveData; i=SBUF; switch(i) { case'0':led=0;break; case'1':led=1;break; case'2': { while(1) { led=0; delay(45000); led=1; delay(45000); } break; } case'3': { while(1) { led=0; delay(25000); led=1; delay(25000); } break;} case'4': { while(1) { led=0; delay(15000); led=1; delay(15000); } break; } } receiveData=SBUF; RI=0; SBUF=receiveData; while(!TI); TI=0; } void main() { UsartInit(); while(1); } ```
arm单片机w7500p如何使用gpio,通过按键来控制gpio,然后通过串口送出去。
按键按下去gpio为1,然后把gpio的数据1通过串口发送出去,然后在串口调试助手中显示1。 一下是我的代码我觉得逻辑没有问题,求大神指点 ![图片说明](https://img-ask.csdn.net/upload/201909/02/1567417444_117961.png) #include <stdio.h> #include "W7500x_uart.h" #include "W7500x_gpio.h" #include "W7500X_crg.h" #include "print_x.h"__ #include "key.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitDef; UART_InitTypeDef UART_InitStructure; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ void delay_ms(__IO uint32_t nCount); /** * @brief Main program * @param None * @retval None */ /* GPIO LED(B) Set */ int main() { unsigned char s='1'; uint8_t i; uint16_t num; char str[10]=""; /*System clock configuration*/ SystemInit(); // *(volatile uint32_t *)(0x41001014) = 0x0060100; //clock setting 48MHz /* CLK OUT Set */ PAD_AFConfig(PAD_PA,GPIO_Pin_12, PAD_AF1); // PAD Config - CLKOUT used 3nd Function /* UART0 and UART1 configuration*/ UART_StructInit(&UART_InitStructure); /* Configure UART0 */ UART_Init(UART1,&UART_InitStructure); UART_ITConfig(UART1,UART_IT_FLAG_RXI,ENABLE); S_UART_Init(115200); //S_UART_SetBaud(115200); KEY_Init(); /* Retarget functions for GNU Tools for ARM Embedded Processors*/ GPIO_InitDef.GPIO_Pin = GPIO_Pin_12; // Set to Pin_5 (LED(B)) GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output GPIO_Init(GPIOC, &GPIO_InitDef); PAD_AFConfig(PAD_PC,GPIO_Pin_12, PAD_AF1); // PAD Config - LED used 2nd Function // GPIO_SetBits(GPIOC, GPIO_Pin_12); // LED(B) Off while(1) { if(KEY_Csan() == 0) i++; if(i%2 == 0) { GPIO_SetBits(GPIOC, GPIO_Pin_12); num=GPIO_ReadOutputData(GPIOC); UART_SendData(UART1,num); //S_UART_SendData(num); str[0]=num+48; prt_str(str); } else { GPIO_ResetBits(GPIOC, GPIO_Pin_12); num=GPIO_ReadOutputData(GPIOC); UART_SendData(UART1,num); //UART_SendData(num); str[0]=num+48; prt_str(str); } } /* for(;;) { S_UART_SendData(s); printf("UART 1 Test(#1)\r\n"); prt_str("\r\11\r\n"); } // UartPuts(UART1,"UART 1 Test(#1)\r\n"); */ } void delay_ms(__IO uint32_t nCount) { volatile uint32_t delay = nCount * 2500; // approximate loops per ms at 24 MHz, Debug config for(; delay != 0; delay--) __NOP(); } ``` ```
为什么我包含了stdio.h,也重新定向到了C库函数,但进行stm32和电脑的串口实验中,printf语句还是没有执行?
#include "stm32f10x.h" #include "LED.h" #include "USART.h" #include "stdio.h" void Show_Message(void); char ch; int main(void) { /* 初始化RGB彩灯 */ LED_GPIO_Config(); /* 初始化USART 配置模式为 115200 8-N-1 */ USART_Config(); /* 打印指令输入提示信息 */ Show_Message(); while(1) { char ch; /* 获取字符指令 */ ch=getchar(); printf("接收到字符:%c\n",ch); /* 根据字符指令控制RGB彩灯颜色 */ switch(ch) { case '1': LED_RED; break; case '2': LED_GREEN; break; case '3': LED_BLUE; break; case '4': LED_YELLOW; break; case '5': LED_PURPLE; break; case '6': LED_CYAN; break; case '7': LED_WHITE; break; case '8': LED_RGBOFF; break; default: /* 如果不是指定指令字符,打印提示信息 */ Show_Message(); break; } } } static void Show_Message(void) { printf("\r\n 这是一个通过串口通信指令控制RGB彩灯实验 \n"); printf("使用 USART 参数为:%d 8-N-1 \n",DEBUG_USART_BAUDARATE); printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n"); printf(" 指令 ------ 彩灯颜色 \n"); printf(" 1 ------ 红 \n"); printf(" 2 ------ 绿 \n"); printf(" 3 ------ 蓝 \n"); printf(" 4 ------ 黄 \n"); printf(" 5 ------ 紫 \n"); printf(" 6 ------ 青 \n"); printf(" 7 ------ 白 \n"); printf(" 8 ------ 灭 \n"); } 这是main.c里的。本来是模仿秉火的程序写的,但结果串口发数据可以控制灯的状态,但printf后面的内容却没法在串口助手上显示,后来几乎是把源代码都复制了过来,还是显示不了。源代码就可以在串口助手上显示printf语句内的内容,keil的微库我也勾选了。是不是我的keil哪里还没有设置好?
51单片机TCRT5000红外避障模块
/****************************************** 传感器触发测试 单片机:STC89C52 波特率:9600 *****************************************/ #include <reg52.h> unsigned char date; #define uchar unsigned char #define uint unsigned int sbit key1=P3^1; /* 函数申明 -----------------------------------------------*/ void delay(uint z); void Initial_com(void); //*********************************************************** /* ******************************************************************************** ** 函数名称 : delay(uint z) ** 函数功能 : 延时函数 ******************************************************************************** */ void delay(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } //****************************** //*****串口初始化函数*********** //****************************** void Initial_com(void) { EA=1; //开总中断 ES=1; //允许串口中断 ET1=1; //允许定时器T1的中断 TMOD=0x20; //定时器T1,在方式2中断产生波特率 PCON=0x00; //SMOD=0 SCON=0x50; // 方式1 由定时器控制 TH1=0xfd; //波特率设置为9600 TL1=0xfd; TR1=1; //开定时器T1运行控制位 } //************************* //**********主函数********* //************************* main() { Initial_com(); while(1) { if(key1==0) { delay(); //消抖动 if(key1==0) //确认触发 { SBUF=0X01; delay(200); } } if(RI) { date=SBUF; //单片机接受 SBUF=date; //单片机发送 RI=0; } } } ``` ```51单片机 买了一个TCRT5000红外避障模块,发现它接上电源后一检测到有障碍物LED就亮,都不用加载代码,求问这种模块可以实现特定时间检测到障碍物才亮吗? 附上卖家代码,
问下大神定时器T0中断导致串口通信无法正常进行的问题。
这是我的代码,将之烧入51单片机时,串口通信本来是让led显示,但是可能由于红外遥控的中断函数干扰了串口通信,导致红外遥控工作正常,串口通信无法进行,led无法显示。 #include<reg51.h> #include<intrins.h> #include"lcd.h" #include"temp.h" #define uint unsigned int #define uchar unsigned char sbit moto=P1^0; uchar CNCHAR[6] = "摄氏度"; void LcdDisplay(int); void UsartConfiguration(); /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; //ES=1; //打开接收中断 //EA=1; //打开总中断 TR1=1; //打开计数器 } uchar time0; bit IRok;//33数据位处理完成标志位 bit handle_ok; uchar IRcode[4];//4个字节 uchar IRdata[33];//33位数据 void InitUART() //定时器初始化 { TMOD=0x02;//定时器重装初值 TH0=0; TL0=0; EA=1; EX0=1; TCON=0X01; ET0=1; TR0=1;//启动定时器 } void t0() interrupt 1 { time0++;//一次中断为277.76us } void int0() interrupt 0 { static uchar i; static bit flag; if(flag) { ES=0; if((time0<54)&&(time0>32)) i=0; IRdata[i]=time0; time0=0; i++; if(i==33) { i=0; IRok=1; } } else { time0=0; flag=1; } } void handle_data() { uchar i;//处理四个字节 uchar j;//处理八位 uchar k;//处理三十三个数据 k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { if(IRdata[k]>5) IRcode[i]|=0x80; k++; if(j<7) IRcode[i]>>=1; } } handle_ok=1; } void work() { uchar j; j=0x01; switch (IRcode[2]) { case 0x0c:moto=0;break;//1 数字一按键停止(修改这里更改控制按键) case 0x18:moto=1;break;//2数字二按键启动 default:break; } } but() { while(1) { if(IRok) { handle_data(); IRok=0; } if(handle_ok)//如果处理完成处理遥控器相关程序 { work(); handle_ok=0; } } } void main() { InitUART(); UsartConfiguration(); LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); while(1) { but(); LcdDisplay(Ds18b20ReadTemp()); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : LCD显示读取到的温度 * 输入 : v * 输出 : 无 *******************************************************************************/ void LcdDisplay(int temp) //lcd显示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 SBUF='-';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } if(temp>=2900) { moto=1; //开启电机 } else { moto=0; //关闭电机 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器 while (!TI) ; //等待发送数据完成 TI = 0; LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //个位 SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x85); //写地址 80表示初始地址 LcdWriteData('.'); //显示 ‘.’ SBUF = '.';//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x86); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x87); //写地址 80表示初始地址 LcdWriteData('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; for(i=0; i<6; i++) { SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } }
如何通过串口修改时钟的时间
请问大神们如何在这个程序里添加串口来改变时钟啊 #include<reg51.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ //此表为 LED 的字模, 共阴数码管 0-9 - uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 /*定义并初始化变量*/ uchar seconde=0;//秒 uchar minite=0;//分 uchar hour=12; //时 uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1 uchar shi=0;//闹铃功能 uchar fen=0; uchar bjcs;//报警次数 sbit P1_0=P1^0; //second 调整定义 sbit P1_1=P1^1; //minite调整定义 sbit P1_2=P1^2; //hour调整定义 sbit P1_5=P3^0; //整点报时 sbit P1_3=P1^3; //闹铃功能,调整时间 sbit P1_6=P1^6; //调整时 sbit P1_7=P1^7; //调整分 sbit P1_4=P1^4; //关闭闹铃 /*函数声明*/ void delay(uint k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( ); //键盘扫描子程序 /*延时子程序*/ void delay (uint k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /*时间处理子程序*/ void time_pro(void) { if(seconde==60) { seconde=0; minite++; if(minite==60) { minite=0; hour++; if(hour==24) { hour=0; } } } } /*显示子程序*/ void display(void) { if(P1_3==1) { P2=0XFE; P0=dispcode[seconde%10];//秒个位 delay(1); P2=0XFD; P0=dispcode[seconde/10];//秒十位 delay(1); P2=0XFB; P0=dispcode[10];//间隔符 - delay(1); P2=0XF7; P0=dispcode[minite%10];//分个位 delay(1); P2=0XEF; P0=dispcode[minite/10];//分十位 delay(1); P2=0XDF; P0=dispcode[10];//间隔符 - delay(1); P2=0XBF; P0=dispcode[hour%10];//时个位 delay(1); P2=0X7F; P0=dispcode[hour/10];//时十位 delay(1); } } /*键盘扫描子程序*/ void keyscan(void) { if(P1_0==0)//秒位的调整 { delay(30); if(P1_0==0) { seconde++; if(seconde==60) { seconde=0; } } delay(250); } if(P1_1==0)//分位的调整 { delay(30); if(P1_1==0) { minite++; if(minite==60) { minite=0; } } delay(250); } if(P1_2==0)//时位的调整 { delay(30); if(P1_2==0) { hour++; if(hour==24) { hour=0; } } delay(250); } } /*整点报警*/ void zhengdian (void) { if((seconde==0)&(minite==0))//整点报时 { P1_5=0; delay(1000); P1_5=1; } } /*定时闹钟*/ void dingshi(void) { if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。 { P2=0XFE; P0=dispcode[0];//秒个位 delay(1); P2=0XFD; P0=dispcode[0];//秒十位 delay(1); P2=0XFB; P0=dispcode[10];//间隔符 - delay(1); P2=0XF7; P0=dispcode[fen%10];//分个位 delay(1); P2=0XEF; P0=dispcode[fen/10];//分十位 delay(1); P2=0XDF; P0=dispcode[10];//间隔符 - delay(1); P2=0XBF; P0=dispcode[shi%10];//时个位 delay(1); P2=0X7F; P0=dispcode[shi/10];//时十位 delay(1); } if(P1_6==0)//设定时 { delay(30); if(P1_6==0) { shi++; if(shi==24) { shi=0; } } delay(250); } if(P1_7==0)//设定分 { delay(30); if(P1_7==0) { fen++; if(fen==60) { fen=0; } } delay(250); } if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警六十次。 { for(bjcs=0;bjcs<60;bjcs++) { P1_5=0; delay(500); P1_5=1; delay(500); } } } /*主函数*/ void main(void) { P1=0XFF; TMOD = 0x11; //time0为定时器,方式1 TH0=0x3c; //预置计数初值,50ms TL0=0xb0; EA=1; //总中断开 ET0=1; //允许定时器0中断 TR0=1; //开启定时器0 while (1) { keyscan(); //按键扫描 dingshi();//定时闹钟 zhengdian();//整点报时 display(); //显示时间 } } void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次 { TH0=0x3c; //手动加载计数脉冲次数 TL0=0xb0; TMOD=0x11; mstcnt++; //用于计算时间,每隔50ms加1 if(mstcnt==20)//mstcnt满20即为一秒 { seconde++;//秒+1 time_pro( ); //时间处理 mstcnt=0; //对计数单元的清零,重新开始计数 } }
rs485多路串口通信 。。
DM368开发板和一个单片机板通过RS485串口通信。 DM368开发板同时发送一组数据给单片机板和云台比如:aa 55 05 00 33 44 14 90 00 单片机板接收后返回另一组数据给DM368开发板比如:AA 55 16 00 11 22 33 44 00 00 10 00 32 47 42 47 D2 01 这个程序改怎么写? PS: RS485为半双工 只能读或者只能写。 附上:我已写程序。哪里不对? #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <termios.h> #include <sys/ioctl.h> #define GIO_RS485_CTRL 51 #define URAT0_RXD 19 #define URAT0_TXD 18 #define RS485_DEVICE_NAME "/dev/ttyS1" typedef struct { int pin_idx; int pin_dir; int pin_sta; } davinci_gio_arg; typedef enum { AT91PIO_DIR_OUT = 0, AT91PIO_DIR_INP } davinci_gio_dir; #define IOCTL_PIO_SETDIR _IOW('Q', 0x01, int) //Set pio direct #define IOCTL_PIO_GETDIR _IOR('Q', 0x02, int) //Get pio direct #define IOCTL_PIO_SETSTA _IOW('Q', 0x03, int) //Set pio status #define IOCTL_PIO_GETSTA _IOR('Q', 0x04, int) //Get pio status //IOCTL for FIQ #define IOCTL_FIQ_SETIRQ _IOW('Q', 0x05, int) //Set fiq handle #define LEN 16 #define DEV_PIO_LED "/dev/pio" #define PIO_NUM 47 int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits){ struct termios new_cfg,old_cfg; int speed; /*保存并测试现有的串口参数设置*/ if(tcgetattr(fd,&old_cfg)!=0){ perror("tcgetattr"),exit (-1); } /*设置字符大小*/ new_cfg = old_cfg; cfmakeraw(&new_cfg); new_cfg.c_cflag &= ~CSIZE; /**/ switch(baud_rate) { case 2400: { speed = B2400; } break; case 4800: { speed = B4800; } break; case 9600: { speed = B9600; } break; case 19200: { speed = B19200; } break; case 38400: { speed = B38400; } break; case 115200: { speed = B115200; } break; } cfsetispeed(&new_cfg,speed); cfsetospeed(&new_cfg,speed); /*停止位*/ switch(data_bits) { case 7: { new_cfg.c_cflag |=CS7; } break; default: case 8: { new_cfg.c_cflag |=CS8; } break; } /*奇偶校验*/ switch(parity) { default: case 'n': case 'N': { new_cfg.c_cflag &=~PARENB; new_cfg.c_iflag &=~INPCK; } break; case 'o': case 'O': { new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_iflag |= INPCK; } break; case 'e': case 'E': { new_cfg.c_cflag |= PARENB; new_cfg.c_cflag &= ~PARODD; new_cfg.c_iflag |= INPCK; } break; case 's': case 'S': { new_cfg.c_cflag &= ~PARENB; new_cfg.c_cflag &= ~CSTOPB; } break; } /*设置停止位*/ switch(stop_bits) { default: case 1: { new_cfg.c_cflag &= ~CSTOPB; } break; case 2: { new_cfg.c_cflag |= CSTOPB; } } new_cfg.c_cc[VTIME] = 0; new_cfg.c_cc[VMIN] = 1; /*处理未接受字符*/ tcflush(fd,TCIFLUSH); /*激活新配置*/ if((tcsetattr(fd,TCSANOW,&new_cfg))!=0){ perror("tcsetattr"), exit (-1); } return 0; } int open_port(void){ int fd; fd =open("dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY); if(fd < 0) { perror("open serial port"), exit (-1); } if(fcntl(fd,F_SETFL,0)<0) { perror("fcntl F_SETFL\n"); exit (-1); } if(isatty(STDIN_FILENO)==0) { perror("standrd input is not a terminal device"); exit (-1); } return fd; } void read_485 (void) { char buff[100] = {0}; int fds,i; int len = 0; int fd_gpio = 0; unsigned char val; fd_gpio = open(DEV_PIO_LED, O_RDWR); if(fd_gpio < 0) { perror("fd_gpio open err"); exit (-1); } //set dir of the pin davinci_gio_arg arg; arg.pin_idx = PIO_NUM; arg.pin_dir = AT91PIO_DIR_OUT; arg.pin_sta = 0; ioctl(fd_gpio, IOCTL_PIO_SETDIR, &arg); //set the value of the pin ioctl(fd_gpio, IOCTL_PIO_SETSTA, &arg); if((fds = open_port())<0)//打开设备 { perror("open_port"); exit (-1); } if(set_com_config(fds,2400,8,'N',1)<0)//配置串口 { perror("set_com_config"); exit (-1); } printf ("rev ready!\n"); len = read (fds, buff, sizeof (buff)); if (len < 0) { perror ("read err"); exit (-1); } printf ("%s\n", buff); close (fds); printf ("test aaaaa\n"); } void *write_rs485(void) { int fds,i; int len = 0; int fd_gpio = 0; unsigned char val; fd_gpio = open(DEV_PIO_LED, O_RDWR); if(fd_gpio < 0) { perror("fd_gpio open err"); exit (-1); } //set dir of the pin davinci_gio_arg arg; arg.pin_idx = PIO_NUM; arg.pin_dir = AT91PIO_DIR_OUT; arg.pin_sta = 1; ioctl(fd_gpio, IOCTL_PIO_SETDIR, &arg); //set the value of the pin ioctl(fd_gpio, IOCTL_PIO_SETSTA, &arg); if((fds = open_port())<0)//打开设备 { perror("open_port"); exit (-1); } if(set_com_config(fds,2400,8,'N',1)<0)//配置串口 { perror("set_com_config"); exit (-1); } // while(1) // { printf("send ready!\n"); char buff[] = "aa 55 05 00 33 44 14 90 00"; int len1 = write(fds,buff,sizeof (buff)); if (len1 < 0) { perror ("write err"); exit (-1); } printf ("send ok!\n"); // } close (fds); } int main (void) { pthread_t tTransCtrlThread; if(pthread_create(&tTransCtrlThread,NULL,write_rs485,NULL)) { perror ("read_rs485 create fail"); exit (-1); } sleep (5); read_485(); return 0; }
在STM32上做SPI方式的ADXL345程序,无法读出ID,全是FF?
![图片说明](https://img-ask.csdn.net/upload/201906/27/1561593720_113653.jpg) 我用的ADXL345在淘宝上买的,型号是GY291 #ifndef __SPI_H #define __SPI_H #include "sys.h" void SPI1_Init(void); //初始化SPI1口 void SPI1_SetSpeed(u8 SpeedSet); //设置SPI1速度 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "spi.h" #include "delay.h" //以下是SPI模块的初始化代码,配置成主机模式 //SPI口初始化 //这里针是对SPI1的初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟 //GPIOFA5,6,7初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_4;//PA4片选 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PB3复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PB4复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PB5复用为 SPI1 //这里只针对SPI口初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 GPIO_SetBits(GPIOA,GPIO_Pin_4); SPI_Cmd(SPI1, ENABLE); //使能SPI外设 // SPI1_ReadWriteByte(0xff);//启动传输 } //SPI1速度设置函数 //SPI速度=fAPB2/分频系数 //@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescaler_256 //fAPB2时钟一般为84Mhz: /* 初始化包括了spi速度在内的各种参数,而速度设置函数,则只设置SPI的速度,方便在代码里面调用. 比如sd卡例程,在SD卡初始化的时候,SPI频率必须比较低,但是初始化成功以后,就可以设置到很高了. 这个时候调用SPI速度设置函数,就比较方便. */ void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler) { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性 SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率 SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 SPI_Cmd(SPI1,ENABLE); //使能SPI1 } //SPI1 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI1_ReadWriteByte(u8 TxData) { u8 val,val1; GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val1=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); delay_ms(2); GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(2); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, 0XFF); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte val=SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); return val+val1; //返回通过SPIx最近接收的数据 } #ifndef __ADXL345_H #define __ADXL345_H #include "spi.h" #define DEVICE_ID 0X00 //器件ID,0XE5 #define THRESH_TAP 0X1D //敲击阀值 #define OFSX 0X1E #define OFSY 0X1F #define OFSZ 0X20 #define DUR 0X21 #define Latent 0X22 #define Window 0X23 #define THRESH_ACK 0X24 //有误,THRESH_ACT #define THRESH_INACT 0X25 #define TIME_INACT 0X26 #define ACT_INACT_CTL 0X27 #define THRESH_FF 0X28 #define TIME_FF 0X29 #define TAP_AXES 0X2A #define ACT_TAP_STATUS 0X2B #define BW_RATE 0X2C #define POWER_CTL 0X2D #define INT_ENABLE 0X2E #define INT_MAP 0X2F #define INT_SOURCE 0X30 #define DATA_FORMAT 0X31 #define DATA_X0 0X32 #define DATA_X1 0X33 #define DATA_Y0 0X34 #define DATA_Y1 0X35 #define DATA_Z0 0X36 #define DATA_Z1 0X37 #define FIFO_CTL 0X38 #define FIFO_STATUS 0X39 u8 ADXL345_Init(void); //初始化ADXL345 u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 #endif #include "adxl345.h" #include "sys.h" #include "delay.h" #include "math.h" #include "usart.h" //初始化ADXL345. //返回值:0,初始化成功;1,初始化失败. u8 ADXL345_Init(void) { u8 ID; SPI1_Init(); //初始化IIC总线 if(SPI1_ReadWriteByte(DEVICE_ID)==0XE5) //读取器件ID { printf("\r\nDEVICE_ID=%0x",ID); return 0; } printf("\r\n失败DEVICE_ID=%0x",ID); return 1; } //读ADXL345寄存器 //addr:寄存器地址 //返回值:读到的值 #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "lcd.h" #include "adxl345.h" #include "math.h" int main(void) { delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 LED_Init(); //初始化与LED连接的硬件接口 while(1) { while(ADXL345_Init()) //3D加速度传感器初始化 { delay_ms(1000); } } } ```
一个关于RFID串口接收IC卡号并让单片机识别不同卡号并作出不同判断的问题
单片机连接一个RFID读卡器串口,用来刷不同的IC卡,用电脑串口助手测试可以返回两张卡号: 白卡卡号:20 00 00 08 04 00 00 00 24 AA 54 1A 33 03 塑料卡号:20 00 00 08 04 00 00 00 54 BF D5 E5 28 03 先想让单片机接收24 AA 54 1A 33,54 BF D5 E5 28这两段进行识别,识别到前者亮灯,识别到后者灭灯,但是现在这个用于识别方面的程序我有些困惑,烦劳指正! 程序: #include<reg51.h> #include<intrins.h> #include <string.h> unsigned char UART_data; unsigned char UART_ID[5]={0}; unsigned int x=0; unsigned int j=0; unsigned char ID1[]={0x24,0xAA,0x54,0x1A,0x33}; unsigned char ID2[]={0x54,0xBF,0xD5,0xE5,0x28}; sbit led = P1 ^ 7; void UART_R(void) interrupt 4 { if(RI==1) { UART_data=SBUF; while(!RI); RI = 0; x++; if(x>=9&&x<=13) { UART_ID[j]=UART_data; j++; } if(x>13) { x=0; j=0; } } } void UART_Init(void) { TMOD = 0x20; SCON = 0x50; TH1 = 0xFD; //设置波特率 9600 TL1 = 0xFD; TR1 = 1; //启动定时器1 ES = 1; //开串口中断 EA = 1; //开总中断 } void Main() { UART_Init(); while(1) { if(strcmp(UART_ID,ID1)==0) {led=0;} if(strcmp(UART_ID,ID2)!=0) {led=1;} } }
51单片机模拟spi控制电力载波芯片MI200E,发送0xaa,接收有显示,但不是0xaa。
想测试发送0xaa,但接收不对,而且接收更像是乱码,改了很多地方都不对,不知道问题出在哪里,希望各位大神帮忙看看代码错在哪。我用的keil3编译环境,51单片机,电力线载波芯片是MI200E,测试接收0xaa是通过8个led灯(也用串口显示过,和led灯显示相匹配)第一次提问题,不知道怎么把MI200E的数据手册和应用手册贴出来,在代码后贴出了文档在百度文库上的网址,麻烦各位大神了,小弟这次是碰到棘手困难了,在这先谢了。代码如下: /********发送程序*********************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //sbit MOSI=P1^0; //主设备发送从设备接收线,master output subordinate input //sbit MISO=P1^1; //从设备发送主设备接收线 master input subordinate output sbit SDO=P1^2; //p1.3口模拟主机输出 主设备发送从设备接收 sbit SDI=P1^1; //p3.2口模拟主机输入,接到外部中断0 主设备接收从设备发送 sbit sck=P1^3; //SPI时钟 sbit cs=P1^4; //片选 p1.3 sbit MI200E_RST=P1^5; //复位 sbit ceshi1=P0^6; sbit ceshi2=P0^7; uchar num; uchar RDSR_command; //用来读0x82 uchar CRC_H,CRC_L; uchar step,i; void delay(uint z);//延时 void cudelay_50us(); void init_MI200E();//初始化 void Write_CommandReg(uchar add,uchar com);//写控制指令 uchar Read_CommandReg(uchar add);//读控制指令 void Write_DataReg(uchar add,uchar dat);//写数据,dat应是16位的 void Write_DataReg2(uchar add,uchar dat_H,uchar dat_L);//改进,将高低8位分开发送 uchar Read_DataReg(uchar add);//读数据 void send(); void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void cudelay_50us() { uchar i; for(i=0;i<5;i++); } void init_MI200E() //初始化 { MI200E_RST=0; delay(600); //要求延时超过500ms MI200E_RST=1; delay(60); //要求延时超过50ms Write_CommandReg(0x01,0xFF); Write_CommandReg(0x0C,0x58); Write_CommandReg(0x0D,0x01); //应用笔记这样写 // Write_CommandReg(0x0D,0x0A); //数据手册这样写 Write_CommandReg(0x10,0x66); Write_CommandReg(0x12,0x66); Write_CommandReg(0x14,0x66); Write_CommandReg(0x11,0x88); Write_CommandReg(0x13,0x88); Write_CommandReg(0x15,0x88); Write_CommandReg(0x07,0xFF); Write_CommandReg(0x0A,0x00); Write_CommandReg(0x0B,0x00); } void init() { TMOD=0x01;//设置定时器0工作方式1 TH0=(65536-2293)/256;//定时5ms TL0=(65536-2293)%256; EA=1; ET0=1;//开定时器0 TR0=1;//启动定时器0 } //写入控制寄存器 void Write_CommandReg(uchar add,uchar com) { uchar i; uchar mark; cs=0; mark=0x80; _nop_(); //_nop_();延时1us _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } mark=0x80; for(i=0;i<8;i++) { sck=0; _nop_(); if(com&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); sck=0; cs=1; } //读取控制寄存器 uchar Read_CommandReg(uchar add) //时序有问题,返回的readdata有三个高,目测是TI、carr和 { //Frame,但P2口值检测出Frame为高 uchar i; uchar mark; uchar readdata; cs=0; mark=0x80; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; // _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); _nop_(); for(i=0;i<8;i++) { //此处不能加延时 sck=0; _nop_(); readdata<<=1; if(SDI) { readdata|=1; } else { readdata&=0xFE; } sck=1; _nop_(); } _nop_(); sck=0; _nop_(); cs=1; return(readdata); } //写入数据寄存器 void Write_DataReg(uchar add,uchar dat) { uchar i; uchar mark; uchar marklong; cs=0; mark=0x80; marklong=0x8000; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<16;i++) { sck=0; _nop_(); if(dat&marklong) { SDO=1; } else { SDO=0; } sck=1; _nop_(); marklong>>=1; } _nop_(); sck=0; cs=1; } void Write_DataReg2(uchar add,uchar dat_H,uchar dat_L) { uchar i; uchar mark; uint marklong; cs=0; mark=0x80; marklong=0x8000; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<8;i++) { sck=0; _nop_(); if(dat_H&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<8;i++) { sck=0; _nop_(); if(dat_L&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); sck=0; cs=1; } //读取数据寄存器 uchar Read_DataReg(uchar add) { uchar i; uchar mark; uint readdata; cs=0; mark=0x80; readdata=0; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); _nop_(); for(i=0;i<16;i++) { sck=0; _nop_(); readdata<<=1; if(SDI) { readdata|=1; } else { readdata&=0xFE; } sck=1; _nop_(); } _nop_(); sck=0; cs=1; return(readdata); } void send() { // Write_CommandReg(0x01,0x01); //bit6~4扩频码字,bit3~2波特率选择,bit1~0载波频率 //配置进入发送状态 switch(step) { case 0: { Write_CommandReg(0x01,0x0d);//将0x01的bit2、3至高,其余不变,以最低速率发送bit2、3 // Write_CommandReg(0x02,0x00);//将TI复位 Write_DataReg2(0x04,0xff,0xff); //发送0xff,0xff引导码 step=1; } break; case 1: { Write_CommandReg(0x02,0xfd);//将0x02的CRC清零 // Write_CommandReg(0x02,0x00);//将TI复位 Write_DataReg2(0x04,0x1a,0x0c);//发送bit3 0x1a和bit4 波特率和长度 step=2; } break; case 2: { Write_CommandReg(0x01,0x01);//将bit2、3恢复原设波特率1600和76.8kHZ // Write_CommandReg(0x02,0x00);//将TI复位 Write_DataReg(0x04,0xaa);//发送bit5,即使改成0xaaaa也不对 for(i=0;i<10;i++) //延时50us { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } CRC_H=Read_CommandReg(0xa8); //读CRC CRC_L=Read_CommandReg(0xa9); step=3; } break; case 3: { // Write_CommandReg(0x02,0x00);//将TI复位 Write_DataReg2(0x04,CRC_H,CRC_L);//发送CRC step=0; } break; default: {delay(10);} break; } } void main() { init(); init_MI200E(); Write_CommandReg(0x02,0x80); Write_DataReg2(0x04,0xff,0xff); Write_CommandReg(0x01,0x01); //bit6~4扩频码字,bit3~2波特率选择,bit1~0载波频率 step=0; sck=0; SDI=1; while(1); } void timer0() interrupt 1//2.5ms { // P1|=1; TH0=(65536-2293)/256;// TL0=(65536-2293)%256;//重装初值 // Write_CommandReg(0x02,0x80); RDSR_command=Read_CommandReg(0x82); P2=RDSR_command; if((RDSR_command & 0x80)==0x80) //每隔2.5ms查询0x82,判断bit7 TI是否为1 { ceshi2=0; // P1&=0xFE; Write_CommandReg(0x02,0x00);//将TI复位 // delay(5); send(); //TI为1执行发送,TI为1往发送寄存器写入数据,之后TI需复位 // Write_CommandReg(0x01,0x0d);//将0x01的bit2、3至高,其余不变,以最低速率发送bit2、3 // Write_DataReg2(0x04,0xff,0xff); //发送0xff,0xff引导码 // P1|=1; // P0=0xaa; } // P1&=0xFE; } /*************接收程序************************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //sbit MOSI=P1^0; //主设备发送从设备接收线,master output subordinate input //sbit MISO=P1^1; //从设备发送主设备接收线 master input subordinate output sbit SDO=P1^2; //p1.3口模拟主机输出 主设备发送从设备接收 sbit SDI=P1^1; //p3.2口模拟主机输入,接到外部中断0 主设备接收从设备发送 sbit sck=P1^3; //SPI时钟 sbit cs=P1^4; //片选 p1.3 sbit MI200E_RST=P1^5; //复位 sbit ceshi1=P0^6; sbit ceshi2=P0^7; uchar num; uchar RDSR_command; //用来读0x82 uchar RDRR_command; //用来读0x83 uchar RDRB0_DataReg; //用来读取数据寄存器0x84 uchar CRC_H,CRC_L,CRC_flag; uchar step,i; void delay(uint z); void cudelay_50us(); void init_MI200E(); void Write_CommandReg(uchar add,uchar com); uchar Read_CommandReg(uchar add); void Write_DataReg(uchar add,uchar dat); void Write_DataReg2(uchar add,uchar dat_H,uchar dat_L); uchar Read_DataReg(uchar add); void send(); void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void cudelay_50us() { uchar i; for(i=0;i<5;i++); } void init_MI200E() //初始化 { MI200E_RST=0; delay(600); //要求延时超过500ms MI200E_RST=1; delay(60); //要求延时超过50ms Write_CommandReg(0x01,0xFF); Write_CommandReg(0x0C,0x58); Write_CommandReg(0x0D,0x01); //应用笔记这样写 // Write_CommandReg(0x0D,0x0A); //数据手册这样写 Write_CommandReg(0x10,0x66); Write_CommandReg(0x12,0x66); Write_CommandReg(0x14,0x66); Write_CommandReg(0x11,0x88); Write_CommandReg(0x13,0x88); Write_CommandReg(0x15,0x88); Write_CommandReg(0x07,0xFF); Write_CommandReg(0x0A,0x00); Write_CommandReg(0x0B,0x00); } void init() { TMOD=0x01;//设置定时器0工作方式1 TH0=(65536-2293)/256;//定时5ms TL0=(65536-2293)%256; EA=1; ET0=1;//开定时器0 TR0=1;//启动定时器0 } //写入控制寄存器 void Write_CommandReg(uchar add,uchar com) { uchar i; uchar mark; cs=0; mark=0x80; _nop_(); //_nop_();延时1us _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } mark=0x80; for(i=0;i<8;i++) { sck=0; _nop_(); if(com&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); sck=0; cs=1; } //读取控制寄存器 uchar Read_CommandReg(uchar add) { uchar i; uchar mark; uchar readdata; cs=0; mark=0x80; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; // _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); for(i=0;i<8;i++) { //此处不能加延时 sck=0; _nop_(); readdata<<=1; if(SDI) { readdata|=1; } else { readdata&=0xFE; } sck=1; // _nop_(); } _nop_(); sck=0; _nop_(); cs=1; return(readdata); } //写入数据寄存器 void Write_DataReg(uchar add,uchar dat) { uchar i; uchar mark; uchar marklong; cs=0; mark=0x80; marklong=0x8000; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<16;i++) { sck=0; _nop_(); if(dat&marklong) { SDO=1; } else { SDO=0; } sck=1; _nop_(); marklong>>=1; } _nop_(); sck=0; cs=1; } void Write_DataReg2(uchar add,uchar dat_H,uchar dat_L) { uchar i; uchar mark; uint marklong; cs=0; mark=0x80; marklong=0x8000; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<8;i++) { sck=0; _nop_(); if(dat_H&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } for(i=0;i<8;i++) { sck=0; _nop_(); if(dat_L&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); sck=0; cs=1; } //读取数据寄存器 uchar Read_DataReg(uchar add) { uchar i; uchar mark; uint readdata; cs=0; mark=0x80; readdata=0; _nop_(); _nop_(); for(i=0;i<8;i++) { sck=0; _nop_(); if(add&mark) { SDO=1; } else { SDO=0; } sck=1; _nop_(); mark>>=1; } _nop_(); _nop_(); for(i=0;i<16;i++) { sck=0; _nop_(); readdata<<=1; if(SDI) { readdata|=1; } else { readdata&=0xFE; } sck=1; _nop_(); } _nop_(); sck=0; cs=1; return(readdata); } void send() { // Write_CommandReg(0x01,0x01); //bit6~4扩频码字,bit3~2波特率选择,bit1~0载波频率 //配置进入发送状态 switch(step) { case 0: { Write_CommandReg(0x01,0x0d);//将0x01的bit2、3至高,其余不变,以最低速率发送bit2、3 Write_DataReg2(0x04,0xff,0xff); //发送0xff,0xff引导码 step=1; } break; case 1: { Write_CommandReg(0x02,0xfd);//将0x02的CRC清零 Write_DataReg2(0x04,0x1a,0x0c);//发送bit3 0x1a和bit4 波特率和长度 step=2; } break; case 2: { Write_CommandReg(0x01,0x01);//将bit2、3恢复原设波特率1600和76.8kHZ Write_DataReg(0x04,0xaa);//发送bit5 for(i=0;i<10;i++) //延时50us { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } CRC_H=Read_CommandReg(0xa8); //读CRC CRC_L=Read_CommandReg(0xa9); step=3; } break; case 3: { Write_DataReg2(0x04,CRC_H,CRC_L);//发送CRC ceshi1=1; ceshi2=0; Write_CommandReg(0x02,0x00);//将TI复位 step=0; } break; default: {} break; } } void receive() { switch(step) { case 0: { RDRR_command=Read_CommandReg(0x83); if(RDRR_command!=0x00) { Write_CommandReg(0x01,0x81); step=1; } } break; case 1: { if((RDSR_command & 0x40)==0x40) { step=2; } else { step=1; } } break; case 2: { Write_CommandReg(0x02,0x7a);//将CRC标志位置1 RDRB0_DataReg=Read_DataReg(0x84);//读取0x84 Write_CommandReg(0x02,0x30);//将RI清零 P0=RDRB0_DataReg; step=3; } break; case 3: { CRC_flag=Read_DataReg(0x84);//读取CRC校验标志位 // P0=CRC_flag; if(CRC_flag==1) { Write_CommandReg(0x02,0x00);//将EPF和CRC标志位清零 } } break; default: {} break; } } void main() { init(); init_MI200E(); // Write_CommandReg(0x02,0x80); Write_CommandReg(0x02,0x00); Write_CommandReg(0x01,0x81);//bit6~4扩频码字,bit3~2波特率选择,bit1~0载波频率 Write_CommandReg(0x01,0x8d);//配置接收状态 step=0; sck=0; SDI=1; while(1); } void timer0() interrupt 1//2.5ms { // P1|=1; TH0=(65536-2293)/256;// TL0=(65536-2293)%256;//重装初值 RDSR_command=Read_CommandReg(0x82); P2=RDSR_command; if(((RDSR_command & 0x20)==0x20)&&((RDSR_command & 0x10)==0x10)) //每隔2.5ms查询0x82,判断carr和frame是否为1 { // P1&=0xFE; // Write_CommandReg(0x02,0x00);//将TI复位 // delay(2.5); receive(); //carr和frame为1执行接收 // cudelay_50us(); // ceshi2=0; // Write_CommandReg(0x02,0x30);//将RI清零 //Write_DataReg2(0x04,0xff,0xff); // P1|=1; // P0=0xaa; } // P1&=0xFE; } MI200E数据手册网址:[CSDN移动问答][1] MI200E应用笔记网址:[CSDN移动问答][2] [1]: http://wenku.baidu.com/link?url=stE_-LF4OcojG9xuouzs9Qbi54F6CmP96yoTdgtQ7VInQRp03tBh-A_P4TSIgvJ-vRZ7TaSg0UUNZNbUz36vnhU1QpT91omCDljRUAw8qY3 [2]: http://wenku.baidu.com/link?url=A-0hTe_YiFslr94yLvoqhliuPPIoGZaa98bp-va-Hvi1oO63lC3XW3kAIt4JuWfsAo7BUENnnvGjCWP4hmKFyxecv82QOixL-5ere1IAEYe
用串行口接收W25Q16的ID值为什么不行了 接收的永远是我的初始值
#include"reg511.h" typedef unsigned int uint16; //对数据类型进行声明定义 typedef unsigned char uint8; sbit cs=P1^3; sbit msio=P0^0; sbit clk=P1^4; sbit mosi=P0^1; sbit led=P1^5; uint8 we_d; uint8 Temp1=0X12; void delay_ms(uint16 x) { uint16 j,i; for(j=0;j<x;j++) { for(i=0;i<1100;i++); } } void SPI_WriteByte(uint8 date) { uint8 temp,i; temp = date; for (i = 0; i < 8; i++) { clk=0; if((temp&0x80)==0x80) { mosi=1; } else { mosi=0; } clk=1 ; temp <<= 1; } mosi=0; } uint8 SPI_ReadByte(void) { uint8 temp=0; uint8 i; for(i = 0; i < 8; i++) { temp <<= 1; clk=0 ; if(msio) {temp++; } clk=1 ; } return(temp); } uint16 W25QXX_ReadID(void) { uint16 Temp = 0; uint8 Temp1 = 0; uint8 Temp2 = 0; cs=0; SPI_WriteByte(0x90); //发送读取ID命令 SPI_WriteByte(0x00); SPI_WriteByte(0x00); SPI_WriteByte(0x00); Temp1|=SPI_ReadByte(); Temp2|=SPI_ReadByte(); Temp = Temp1*256+Temp2; cs=1; return Temp; } void UartInit(void) //9600bps@33.1776MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0x94; //设定定时初值 TH1 = 0x94; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //打开接收中断 EA=1; //打开总中断 } void main(void) { uint16 Temp; uint8 Temp2; P1M1=0X00;P1M0=0X00; P0M1 &= 0xE1; P0M0 &= 0xE1; cs=1; //设置P1为推挽输出 UartInit(); // 串口初始化 delay_ms(600); Temp=W25QXX_ReadID(); Temp1=(uint8)(Temp/256); Temp2=(uint8)Temp; } void Usart() interrupt 4 { uint8 receiveData; receiveData=SBUF;//出去接收到的数据 RI = 0;//清除接收中断标志位 SBUF=Temp1;//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 }
windows端使用python3的serial库连接stm32的串口进行数据传输,出现问题,求大神解答
单片机部分代码: ``` while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收数据的长度 printf("\r\n您发送的数据为:\r\n\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } printf("\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\n串口实验\r\n"); printf("@ALIENTEK\r\n\r\n"); } if(times%200==0)printf("输入数据回车结束\n"); if(times%30==0)LED0=!LED0;//LED闪烁,程序正在运行 delay_ms(10); } } ``` python3上代码 ``` import serial ser = serial.Serial() ser.baudrate = 115200 #设置波特率 ser.port = 'COM3' #端口是COM3 ser.bytesize =8 ser.stopbits = 1 #配置停止位 ser.timeout=1 ser.parity=serial.PARITY_NONE #配置奇偶校验位 while True: ser.open() print(ser) data=input() data = data.encode('utf-8') ser.write(data) ser.close() ``` 输出结果: ``` Serial<id=0x2395c0f3a20, open=True>(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False) 49 Serial<id=0x2395c0f3a20, open=True>(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False) 1 Serial<id=0x2395c0f3a20, open=True>(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False) ``` 我用IDLE逐行调试的时候; ``` >>> import serial >>> ser=serial.Serial('COM3',115200) >>> ``` 灯就不亮了 ``` >>> ser.open() Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> ser.open() File "E:\c\python\lib\site-packages\serial\serialwin32.py", line 41, in open raise SerialException("Port is already open.") serial.serialutil.SerialException: Port is already open. >>> print(ser) Serial<id=0x284a7a80c88, open=True>(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) >>> ``` 单片机的程序是板子带的程序,python3代码执行后LED就灭了,数据也传不进去。但串口好像是通了,找了好多代码都不知道怎么解决,现在头都大了,求大佬帮忙。
c8051f020的12位AD采样
/******************************************************************************* 程序测量电压在外部ADC输入和打印   / /结果通过UART终端窗口。  / /系统时钟使用内部24.5 mhz振荡器成倍增加   / / 49 mhz的芯片上的锁相环。结果输出到UART的循环  / /设定的速度基于定时器2的延迟。这个循环定期读取  / / ADC值从一个全局变量,结果。 / / ADC使重复测量速度取决于SAMPLE_RATE使用   / /定时器3。每个ADC转换启动一个中断运行一个   / /平均函数。< INT_DEC >样品平均然后结果值更新。 / /每4的< INT_DEC >,你获得1点有效的决议。   / /例如,< INT_DEC > = 256获得你4位分辨率:4 ^ 4 = 256。 / / ADC输入多路复用器将是单端输入 ************************************************************************************/ #include <c8051f020.h> // SFR declarations #include <stdio.h> #include<intrins.h> /*******16位寄存器定义**********/ sfr16 ADC0 = 0xbe; //ADC0数据 sfr16 RCAP2 = 0xca; //定时器2自动重装 sfr16 RCAP3 = 0x92; //定时器3自动重装 sfr16 TMR2 = 0xcc; //定时器2 sfr16 TMR3 = 0x94; //定时器3 /**********全局常量***************/ #define BAUDRATE 115200 //串口通信的波特率 #define SYSCLK 22118400//外部晶振频率 #define SAMPLE_RATE 100000 //采样频率 #define INT_DEC 256 //积分抽取比采样并取平均值;由过采样并取平均值来提高ADC分辨率的相关 #define SAR_CLK 2500000 //ADC0转换时钟周期的计算 #define SAMPLE_DELAY 50 //采样之前的毫秒延时 sbit led = P1^6; //led = 1是否定 sbit sw1 = P3^7; //sw1 = 0转换开关 void PORT_INIT (void); void OSCILLATOR_INIT (void); void UART0_INIT(); void TIMER3_INIT(int counts); void ADC0_INIT(); void delay_ms(unsigned int ms); void delay4j(); /***********全局变量***********/ long result; // 减小的值 /*********主函数************/ void main() { long measurement; // 测量电压(mv) WDTCN = 0xde; //关闭看门狗 WDTCN = 0xad; OSCILLATOR_INIT(); //初始化晶振 PORT_INIT(); //交叉使能开关 UART0_INIT(); //初始化串口通信0; TIMER3_INIT(SYSCLK/SAMPLE_RATE);//初始化定时器3的溢出采样率 ADC0_INIT(); AD0EN = 1; //ADC0控制寄存器,使能ADC EA = 1; //打开所有中断(总体,但如果子中断关闭,那该中断依旧关闭) while(1) { EA = 0; //关闭中断 /*********12ADC的值是通过积分平均值的测量,数据存储在result中,为右对齐 AIN0.1的实测值为: Vref(mv) measure(mv) =----------------*result(bits) (2^12)-1(bits) ****************************/ measurement = result * 2430 / 4095; // measurement = result; EA = 1; //使能中断 printf("AIN0.1 voltage:%ld mv\n",measurement); // led = ~sw1; //LED反应状态的转换 // delay_ms(SAMPLE_DELAY);//延时50ms delay_ms(1); // delay4j(); } } /************交叉使能开关配置****************/ void PORT_INIT (void) { XBR0 = 0x04; // UART0 线路配置 XBR2 = 0x40; // 交叉使能,设置为弱上拉 P0MDOUT = 0x01; // enable TX0 as a push-pull output P1MDOUT = 0x40; // enable LED as push-pull output } /*************使用外部晶振作为系统时钟***********/ void OSCILLATOR_INIT (void) { int i; // delay counter OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal for (i=0; i < 256; i++) ; // wait for oscillator to start while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle OSCICN = 0x88; // select external oscillator as SYSCLK // source and enable missing clock // detector } /************串口初始化****************/ void UART0_INIT() { SCON0 = 0x50; //UART0控制寄存器设置 TMOD = 0x20; //定时器1的方式寄存器 TH1 = -(SYSCLK/BAUDRATE/16); //定时器1波特率的重装值 CKCON = 0x10; //时钟控制寄存器设置,定时器1使用系统时钟 PCON = 0x80; //电源控制寄存器设置 TR1 = 1; //打开定时器1 TI0 = 1; //发送中断标志 } /*************定时器3的初始化*************/ void TIMER3_INIT(int counts) { TMR3CN = 0x02; //定时器3控制寄存器,停止定时器3,清除TF3,定时器3使用系统时钟 RCAP3 = -counts;//初始化定时器3重装 TMR3 = RCAP3; // 立即重新加载 EIE2 &= ~0x01; //扩展中断允许2寄存器 关闭所有中断 TMR3CN |= 0x04; //打开定时器3,且使用系统时钟 } /**************ADC0的初始化**********/ void ADC0_INIT() { ADC0CN = 0x04; //ADC0控制寄存器,禁止ADC0,一直跟踪方式, //ADC0没完成一次数据转换,当前没有进行数据转换 //定时器3溢出启动ADC0转换数据,ADC0H,ADC0L寄存器数据右对齐 REF0CN = 0x03; //关闭温度传感器,VREF输出缓冲区 AMX0CF = 0x00; //AIN为单端输入 AMX0SL = 0x03; //选择AIC0.1位模拟输入引脚 ADC0CF = (SYSCLK/SAR_CLK)<<3;//ADC转换时钟为2500000 ADC0CF |= 0x00; //设置转换时钟2500000,放大倍数为1 EIE2 |= 0x02; //允许ADC0数据转换结束产生中断请求 } /****************延时ms************/ void delay_ms(unsigned int ms) { CKCON &= ~0x20; // use SYSCLK/12 as timebase RCAP2 = -(SYSCLK/1000/12); // Timer 2 overflows at 1 kHz TMR2 = RCAP2; ET2 = 0; // Disable Timer 2 interrupts TR2 = 1; // Start Timer 2 while(ms) { TF2 = 0; // Clear flag to initialize while(!TF2); // Wait until timer overflows ms--; // Decrement ms } TR2 = 0; // Stop Timer 2 } /***************ADC0的中断*****************/ void ADC0_ISR (void) interrupt 15 { static unsigned int_dec=INT_DEC; // 集成计数器,当int_dec = 0时,置入一个新的结果 static long accumulator=0L; // 整合ADC采样,“0L”为将0转换成long型的 AD0INT = 0; // 清除AD数据转换成功标识符,重新开始下次采样 accumulator += ADC0; //读取ADC的值,并逐次累加 int_dec--; // 更新衰减计数器 if (int_dec == 0) // If zero, then post result { int_dec = INT_DEC; // Reset counter result = accumulator >> 8; accumulator = 0L; // Reset accumulator } } void delay4j() { _nop_(); _nop_(); _nop_(); _nop_(); } c8051f020的12位AD采样频率最高是100ksps,低频的时候可以,但是为什么转换频率为1kHZ的正弦波时数据会混乱呢,
求解释程序,基于gsm烟雾防盗报警
#include<reg52.h> #include <intrins.h> #include <absacc.h> //头文件 #define uint unsigned int #define uchar unsigned char //宏定义 //按键 sbit key1=P3^2; //布防 sbit key2=P3^3; //撤防 sbit key3=P3^4; //紧急报警 sbit BUZZ=P0^4; //蜂鸣器 sbit rsd=P2^4; //热释电输入 sbit yanwu=P2^5; sbit LED_B=P2^3; //布防指示灯 sbit LED_S=P2^0; //发送消息指示灯 uchar code PhoneNO[] ="15046397767"; //接受号码 uchar code somebody[] ="67094EBA8FDB5165FF0C8BF76CE8610F3002"; //有人进入,请注意。 uchar code somebody1[] ="70DF96FE6D535EA68FC79AD8FF0C8BF76CE8610F3002"; //烟雾浓度过高,请注意。 uchar code somebody2[] ="67094EBA8FDB5165FF0C70DF96FE6D535EA68FC79AD8FF0C8BF76CE8610F3002"; //有人进入,烟雾浓度过高,请注意。 uint TIME_50ms=0; //计时的最小分辨率50ms uint time_continue; uchar TIME_ALAM=0; bit flag=0,flag_BF=0; bit flag_time_start=0; bit again=0; bit flag_alam; bit SOS; bit flag_continue; bit into_BF=0; void delay(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void Uart_init() { TMOD= 0X20; //T1 方式2 ,8位 自动重装 TH1=0Xfd; TL1=0Xfd; //9600 TR1=1; // 定时器1启动 SM0=0; // 设置串口的工作模式 SM1=1; //方式1 REN=0; // 允许串口接收数据 ES=0; // 串口中断应许 EA=1; // 开启中断 } void SendASC(uchar d) { SBUF=d; while(!TI); TI=0; } void SendString(uchar *str) { while(*str) { SendASC(*str) ; str++; //delay_uart(1); } } void TIME() { if(flag==0) { delay(50); TIME_50ms++; if(TIME_50ms%10==0) LED_B=!LED_B; if(TIME_50ms>=400) { TIME_50ms=0; flag_BF=1; LED_B=0; flag_time_start=0; again=1; } } else { delay(50); TIME_50ms++; if(TIME_50ms%10==0) { LED_B=!LED_B; if(flag_alam==1) { if(flag_continue==0) { flag_continue=1; time_continue=TIME_50ms; } BUZZ=!BUZZ; if(TIME_50ms>=time_continue+100) { BUZZ=1; flag_continue=0; flag_alam=0; time_continue=0; } } } if(TIME_50ms>=1200) { LED_B=0; TIME_50ms=0; flag_time_start=0; again=1; } } } //按键扫描函数 void keyscan() { if(key1==0&&flag_BF==0)//布防 { delay(5);//延时 if(key1==0) { LED_B=0; flag=0; flag_time_start=1; } while(key1==0); } if(flag_time_start==1) { TIME(); } if(key2==0) { delay(5);//撤防 if(key2==0) { BUZZ=1; //关闭蜂鸣器 flag_alam=0; flag_BF=0; flag=0; flag_time_start=0; LED_S=1; LED_B=1; } while(key2==0); } if(key3==0) { delay(5); if(key3==0) { SOS=1; flag_alam=1; } while(key3==0); } } void GSM_work() { unsigned char send_number; if((rsd==0||yanwu==0)&&flag_BF==1) flag_alam=1; if(((rsd==0||yanwu==0)&&flag_BF==1&&again==1)||SOS==1) { LED_S=0; BUZZ=1; SendString("AT+CMGF=1\r\n"); delay(200); SendString("AT+CSCS=\"UCS2\"\r\n"); delay(200); SendString("AT+CSMP=17,0,2,25\r\n"); delay(200); SendString("AT+CMGS="); //信息发送指令 AT+CMGS=// SendASC('"'); for(send_number=0;send_number<11;send_number++) { SendASC('0'); SendASC('0'); SendASC('3'); SendASC(PhoneNO[send_number]); } SendASC('"'); SendASC('\r'); //发送回车指令// SendASC('\n'); //发送换行指令// delay(200); if(rsd==0&&yanwu==1) SendString(somebody); else if(rsd==1&&yanwu==0) SendString(somebody1); else if((rsd==0&&yanwu==0)||SOS==1) SendString(somebody2); delay(200); SendASC(0x1a); if(SOS==0) { again=0; flag_time_start=1; flag_alam=1; } else if(SOS==1&&flag_time_start==1) { TIME_50ms=0; flag_BF=1; LED_B=0; flag_time_start=0; again=1; } delay(2000); LED_S=1; SOS=0; flag=1; } } void main() { Uart_init(); while(1) { keyscan(); GSM_work(); } }
急切 编程用的是VBScript,在secureCRT
各位版主、大神们: 老板给了一个协议,让我根据这个协议来写一个编码(类似这个东西吧)。用的是VB script 在 SecureCRT上编。 小女子是真的没学过这些东西啊啊啊!!!高中大学都是文科生好吗?!! ~~~~~~~~~~~~~~~~~~~以下为协议内容~~~~~~~~~~~~~~~~~~~~~~ 表1 帧格式 说 明 代 码 帧起始符 68H 地址域 A0 控制码 C 数据长度域 L 数据域 DATA 校验码 CS 结束符 16H 2.1 地址域A:长度为1字节,每字节2位BCD码。0xFF为广播地址。在工装与被测主板通信时为点对点通信方式,固定位0xAA。在WiFi模块测试中,地址域高4bit用于表示工装地址,低4bit用于表示WiFi模块编号,两个编号都从0开始。举例说明,0x06指的是第一个工装的第七个模块,0x13指的是第二个工装的第四个模块。 2.2 控制码C:控制码的格式。 D7 0: 由主站发出的命令帧,1: 由从站发出的命令帧, D6 0: 从站正确应答,1: 从站对异常信息的应答, D5 0:无后续数据帧 D4 0:主板测试协议;1 WiFi模块测试协议 D3--D0:0x01 工装测试参数信息查询(工装与上位机通信) 0x02 工装参数初始化(工装与上位机通信) 0x03 被测主板信息读取 0x04 主板指示灯检测 0x05 温度&WIFI串口电路检测接口单元检测 0x06 主板WIFI电源电压、V5P0电源电压检测 0x07 TDS电路&流量信号处理电路检测 0x08 毫安级电流检测 0x09 微安级电流检测 0x10 工装是否已经准备好 0x90 工装已经准备好 0xD0 工装没有准备好 0x91 检测到测试开始按键按下(从机发送给主机) 0x11 0x91命令已经接收到(主机发送给从机) 0x12 开始烧录程序 0x92 0x12命令已经接收到 0x13 烧录程序时电流测量 0x93 0x13命令已经接收到 0x94 烧录程序时测试到的电流数据,单位为mA,数据长度为2byte。 0x14 烧录程序时测试到的电流数据正确收到 0x15 对模块断电,Tinterval后上电 0x95 0x15命令收到 0x96 0x15命令执行完毕 0x17 正常工作时电流测量 0x97 0x17命令已经接收到 0x98 正常工作时测试到的电流数据,单位为mA,数据长度为2byte。 0x18 正常工作时测试到的电流数据正确收到 0x19 对模块断电,不再上电,测试失败,测试结束 0x99 0x19命令已经接收到 0x9A 0x19命令已经执行完毕 0x1B 对模块断电,测试成功,测试结束 0x9B 0x1B命令已经接收到 0x9C 0x1B命令已经执行完毕 注意:将D6置1,则相应的确认帧为表示相应命令帧接收出错。 2.3 数据长度L:数据域的字节数,十六进制数字。在WiFi模块测试中,如果是不需要带数据的命令帧,数据长度为0. 2.4 数据域DATA:数据域包括数据标识和数据,其结构随控制码的功能而改变。在WiFi模块测试中,如果是不需要带数据的命令帧,数据域不存在。 2.5 校验CS:从帧起始符开始到校验码之前的所有各字节的模256的和,即各字节二进制算术和, 不计超过256的溢出值。 2.6 结束符16H:表示帧信息的结束。 传输次序:数据域数据均应先传送低位字节,后传送高位字节。 2.8 差错控制:帧校验为纵向信息校验和,接收方无论检测到纵向信息校验和出错,放弃该信息帧, 不予响应。在WiFi模块测试中,接收方如果检测到接收到的信息出错,需要回复错误帧。 1应用说明 3.1工装与上位机通信 待定。 3.2工装对被测电路主板进行测试 3.2.1 读取被测主板信息 功能: 读取被测主板信息,主要是判断被测主板是否烧录程序 控制码: C=0x03 数据长度: L=1(数据项长度) 帧格式:68 AA 03 L DATA CS 16 (DATA 见附录说明A) TX: 68 AA 03 00 00 CS 16 (CS为校验和值) 3.2.2 主板指示灯检测 功能: 通知主板将指示灯点亮 控制码: C=04H 数据长度: L=1 帧格式: 68H AA 04 L DATA CS 16 TX: 68 AA 04 00 00 CS 16 (CS为校验和值) 3.2.3 温度&WIFI串口电路检测接口单元检测 功能:工装通知被测主板将WIFI串口引脚(TX、RX)置高,当工装检测到它们被置高后, 再将被测主板的温度传感器接口拉低,当被测主板检测到温度传感器接口被拉低后, 将WIFI串口引脚(TX、RX)拉低。 控制码: C=05H 数据长度: L=1H 帧格式: 68H AA 05 L DATA CS 16 TX: 68 AA 05 00 00 CS 16 (CS为校验和值) 3.2.4 主板WIFI电源电压、V5P0电源电压检测 功能:通知被测主板将各项功能关闭(LED灯置灭、TDS接口两个输出脉冲端置低等)。 控制码: C=06H 数据长度: L=1H 帧格式: 68H AA 06 L DATA CS 16 TX: 68 AA 06 00 00 CS 16 (CS为校验和值) 3.2.5 TDS电路&流量信号处理电路检测 功能:通知被测主板开始接收水量信号,并记录水量脉冲个数。再采集并记录TDS端口的 AD值。最后将接收到的水量信号脉冲个数和TDS端口采集的AD值,按照通讯规约 返回给工装。 控制码: C=07H 数据长度: L=1H 帧格式: 68H AA 07 L DATA CS 16 TX: 68 AA 07 00 00 CS 16 (CS为校验和值) 3.2.6 毫安级电流检测 功能:通知被测主板将各项功能完全开启。 控制码: C=08H 数据长度: L=1H 帧格式: 68H AA 08 L DATA CS 16 TX: 68 AA 08 00 00 CS 16 (CS为校验和值) 3.2.7 微安级电流检测 功能:通知被测主板将各项功能关闭进入低功耗模式。 控制码: C=09H 数据长度: L=1H 帧格式: 68H AA 09 L DATA CS 16 TX: 68 AA 09 00 00 CS 16 (CS为校验和值) ~~~~~~~~~~~~~~~~~~~~~以上是协议内容~~~~~~~~~~~~~~~~~~~~ 然后小女子自己上网搜索资料,自己开始瞎编了一些东西,在了解VBS的时候遇到了一些问题: 1. do loop感觉一定是要用在编码里面的,但是不知道怎么用 2. CS 那个汇总应该用什么函数啊?想不明白。 请大神求救!!!! ~~~~~~~~~~~~~~~~~~~~ 以下是自己瞎编的~~~~~~~~~~~~~~~~~~~ #$Language="VBScript" #$Interface="1.0" Sub Main() Dim SwitchKey SwitchKey=crt.Screen.WaitForStrings ("\x90","\xD0",20) Select case SwitchKey case 1 crt.Dialog.MessageBox "工装已经准备好" & VbCr case 2 crt.Dialog.MessageBox "工装没有准备好" & VbCr End Select crt.Screen.WaitForStrings "\x91" crt.Screen.Send "\0x11" & VbCr crt.Screen.WaitForStrings "\x93" crt.Screen.Send "\0x13" & VbCr crt.Screen.WaitForStrings "\x94" crt.Screen.Send "\0x14" & VbCr crt.Screen.WaitForStrings "\x95" crt.Screen.Send "\0x15" & VbCr crt.Screen.WaitForStrings "\x96" crt.Screen.Send "\0x15" & VbCr crt.Screen.WaitForStrings "\x97" crt.Screen.Send "\0x17" & VbCr crt.Screen.WaitForStrings "\x98" crt.Screen.Send "\0x18" & VbCr crt.Screen.WaitForStrings "\x99" crt.Screen.Send "\0x19" & VbCr crt.Screen.WaitForStrings "\x9A" crt.Screen.Send "\0x19" & VbCr crt.Screen.WaitForStrings "\x9B" crt.Screen.Send "\0x1B" & VbCr crt.Screen.WaitForStrings "\x9C" crt.Screen.Send "\0x19" & VbCr Loop End Sub 请大神求救!!!! 能不能直接来一个完整的编码,然后让我在secureCRT上run一下,然后我边看边理解,万分感谢! 我还不知道怎么悬赏,但是如果有结果的话,一定追加悬赏(虽然还不知道怎么给)但肯定保证!
51单片机加入定时器的定义和中断后,手机APP与单片机只能连接几秒,问题出在哪里
在原来的单片机代码中加入void TF0_isr() interrupt 1和在void InitUART(void)里定义了定时器 ET0=1;TH0=56320/256; L0=56320%256; TR0=1;后,拷到单片机里,手机APP连接WiFi建立链接后,几秒后断开链接,有时甚至无法建立链接。 是串口中断和定时器中断冲突了吗? 请问问题出在哪里,怎么解决 原来正常的情况:单片机和APP连接后,APP能控制LED1、2的亮灭,并显示LED等的状态 #include "DHT11.h" #include <stdio.h> #include "string.h" extern unsigned char F16T,F16RH; //温湿度数据 sbit LED1=P3^7; sbit LED2=P3^6; #define uchar unsigned char #define uint unsigned int unsigned char idata Rxbuff[50],Rxnum; unsigned char Recwifi_data[5]; char *strx=0; char clinetid;//连接ID unsigned char getflag;//获取标志 void Get_Clinet(void); void InitUART(void) //这是串口和定时器的基本配置,配置他的波特率是9600.这些参数都是标准的。 { TMOD|= 0x21; SCON = 0x50; TH1 = 0xFD; TL1 = TH1; PCON = 0x00; EA = 1; //启动中断系统 ES = 1; TR1 = 1; ET0=1;// 定时器的定义 TH0=56320/256; //计数起点为56320 ==10ms溢出一次 TL0=56320%256; TR0=1; } void Clear_Buffer(void)//清空缓存 { int i; // for(i=0;i<50;i++) // Rxbuff[i]=0;// Rxnum=0; } /******************************************************************************/ void delayms(unsigned int x) { unsigned int i; while(x--) for(i=125;i>0;i--); } /* * UART 发送一字节 */ void UART_send_byte(char dat) { SBUF = dat; while (TI == 0); TI = 0; } /* * UART 发送字符串 */ void Send_Str(unsigned char *buf) { while (*buf != '\0') { UART_send_byte(*buf++); } } void ESP8266_SERVER(void)//服务器建立 { Send_Str("AT\r\n"); delayms(500); Send_Str("AT\r\n"); delayms(500); Send_Str("AT\r\n"); delayms(500); Send_Str("ATE0\r\n"); //关闭回显 delayms(500); Send_Str("AT+CWSAP=\042ESP8266_001\042,\0421234567890\042,5,3\r\n"); //设置显示名称和密码 delayms(500); Send_Str("AT+CIPMUX=1\r\n");//启动多连接,建立服务器都需要配置 delayms(500); Clear_Buffer(); Send_Str("AT+CIPSERVER=1,8888\r\n");//建立服务器 delayms(500); strx=strstr((const char*)Rxbuff,(const char*)"OK");//等待建立完成 while(strx==NULL) { Clear_Buffer(); delayms(500); strx=strstr((const char*)Rxbuff,(const char*)"OK");//等待建立完成 } Clear_Buffer(); } void Get_Clinet(void)//判断是否获取到了客户端接入 { uchar i; strx=strstr((const char*)Rxbuff,(const char*)"CONNECT");//返回连接值 if(strx) { Clear_Buffer(); getflag=1; } strx=strstr((const char*)Rxbuff,(const char*)"CLOSE");//返回断开连接 if(strx) { Clear_Buffer(); getflag=0; } if(getflag) { strx=strstr((const char*)Rxbuff,(const char*)"+IPD");//有数据返回 if(strx)//正常获取数据 { clinetid=strx[5]; strx=strstr((const char*)Rxbuff,(const char*)":");//有数据返回 for(i=0;i<2;i++) Recwifi_data[i]=strx[1+i]; //获取手机对LED的控制 if( Recwifi_data[0]=='1'&& Recwifi_data[1]=='0' )//关灯 LED1=1; else if( Recwifi_data[0]=='1'&& Recwifi_data[1]=='1' )//开灯 LED1=0 ; if( Recwifi_data[0]=='2'&& Recwifi_data[1]=='0' )//关灯 LED2=1; else if( Recwifi_data[0]=='2'&& Recwifi_data[1]=='1' )//开灯 LED2=0 ; Clear_Buffer(); } } } void Send_DATA(uchar *buffer) { uchar i; Send_Str("AT+CIPSEND=0,7\r\n"); delayms(300); Send_Str(buffer);//发送数据 delayms(100); strx=strstr((const char*)Rxbuff,(const char*)"SEND OK");//返回OK while(strx==NULL) { delayms(100); strx=strstr((const char*)Rxbuff,(const char*)"SEND OK");//返回OK } strx=strstr((const char*)Rxbuff,(const char*)"+IPD");//有数据返回 ,顺便判断是否有数据返回 if(strx)//正常获取数据 { clinetid=strx[5]; strx=strstr((const char*)Rxbuff,(const char*)":");//有数据返回 for(i=0;i<5;i++) Recwifi_data[i]=strx[1+i]; //获取上位机设定的报警值 Clear_Buffer(); } Clear_Buffer(); } void main() { unsigned char Tx_Buf[10]; uchar i; unsigned char LEDstatus;//灯的状态 delayms(500); delayms(500); delayms(1000); //延时一段时间,让WIFI模块稳定 InitUART(); //初始化串口 ESP8266_SERVER(); IP = 0x10; // PS = 1; // PT0=0; //初始化ESP8266 while(1) { Get_Clinet(); if(getflag) { getDHT11(); //获取温湿度值 Tx_Buf[0]='T'; //帧头 Tx_Buf[1]=F16T/10%10+0x30; //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示 Tx_Buf[2]=F16T%10+0x30; Tx_Buf[3]=F16RH/10%10+0x30; Tx_Buf[4]=F16RH%10+0x30; LEDstatus=LED1; Tx_Buf[5]=LEDstatus+0x30;//发送灯的状态 LEDstatus=LED2; Tx_Buf[6]=LEDstatus+0x30; Send_DATA(Tx_Buf) ;//发送数据 } } } /*****************串口接收中断函数,接收蓝牙模块的数据*********************/ void UARTInterrupt(void) interrupt 4 { if(RI) { ES=0; RI = 0; Rxbuff[Rxnum++]=SBUF; if(Rxnum>=50) Rxnum=0; ES=1; } } void TF0_isr() interrupt 1 //10ms 进入一次 { static int c1; //执行一条指令12个周期,12/11.059M =1.08507us 10ms需要9216个周期 TH0=56320/256; //重装初值 TL0=56320%256; c1++; if(c1>400){ LED1=0; } if(c1>600) { LED1=1; c1=0; } }
STM32官方DSP库进行FFT运算的问题
使用STM32官方的DSP库进行FFT运算,然后求每一个频率点的幅值,并把幅值用printf在串口打印出来,问题是我把计算幅值的函数放到main.c文件中,结果是正确的,但把它放到其他文件中,在main函数中调用,结果就不正确了,哪位大神知道问什么? 这是main函数,作用就是计算FFT后每一点的幅值,其中GetPowerMag(FFT_Out_Array, FFT_Mag_Array);函数是在fft.c中定义的,但结果不对,如果拿到main.c中就正确了 #include "config.h" #include "led.h" #include <math.h> #include "fft.h" #define Fs 6400 //采样率 #define PI2 6.28318530717959 long FFT_In_Array[NPT]; long FFT_Out_Array[NPT]; unsigned long FFT_Mag_Array[NPT/2]; void fft_Init(void); int main(void) { u8 i; RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); USART1_Configuration(); //ADC_Configuration(); //DMA_Configuration(); // initLED(); fft_Init(); //FFT运算 cr4_fft_256_stm32(FFT_Out_Array, FFT_In_Array, NPT); //计算幅值 GetPowerMag(FFT_Out_Array, FFT_Mag_Array); //打印每一点的幅值 for(i=0;i<NPT/2;i++) { printf("%d=%ld\n", i, FFT_Mag_Array[i]); } while (1) { } return 0; } //用指定频率的波形,初始化FFT数组 void fft_Init() { unsigned short i; float fx; for(i=0; i<NPT; i++) { fx = 1500 * sin(PI2 * i * 350.0 / Fs) + 2700 * sin(PI2 * i * 8400.0 / Fs) + 4000 * sin(PI2 * i * 18725.0 / Fs); FFT_In_Array[i] = ((signed short)fx) << 16; } } 以下是fft.c--------------------------------------- #include "fft.h" void GetPowerMag(long *pIn, unsigned long *pMag) { signed short lX,lY; float X,Y,Mag; unsigned short i; for(i=0; i<NPT/2; i++) { lX = (pIn[i] << 16) >> 16; lY = (pIn[i] >> 16); X = NPT * ((float)lX) / 32768; Y = NPT * ((float)lY) / 32768; Mag = sqrt(X * X + Y * Y) / NPT; if(i == 0) pMag[i] = (unsigned long)(Mag * 32768); else pMag[i] = (unsigned long)(Mag * 65536); } }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问