活动介绍

#include "stdio.h" void main( ) { short x=0x8543,y=1,z=2; int p=0x12345678,q=3; asm ( "movzwl -0x16(%ebp),%eax\n\t" "mov %ax,-0x14(%ebp)\n\t" "movswl -0x16(%ebp),%eax\n\t" "mov %eax,-0xc(%ebp)\n\t" "mov -0x10(%ebp),%eax\n\t" "mov %ax,-0x12(%ebp)\n\t" ); printf("x=%d,y=%d,z=%d\n",x,y,z); printf("p=%d,q=%d\n",p,q); }这个对应的C语言怎么写

时间: 2023-07-07 14:17:35 浏览: 182
对应的C语言代码如下: ```c #include <stdio.h> void main() { short x = 0x8543, y = 1, z = 2; int p = 0x12345678, q = 3; __asm__( "movzwl -0x16(%ebp),%eax\n\t" "mov %ax,-0x14(%ebp)\n\t" "movswl -0x16(%ebp),%eax\n\t" "mov %eax,-0xc(%ebp)\n\t" "mov -0x10(%ebp),%eax\n\t" "mov %ax,-0x12(%ebp)\n\t" ); printf("x=%d,y=%d,z=%d\n", x, y, z); printf("p=%d,q=%d\n", p, q); } ``` 注:使用 __asm__ 关键字可以在C语言中嵌入汇编代码。
相关问题

#include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h" #include "hal_uart.h" #include <stdio.h> #include <string.h> #include <stdarg.h> /*****点对点通讯地址设置******/ #define RF_CHANNEL 23 // 频道 11~26 #define PAN_ID 0xAA22 //网络id #define MY_ADDR 0xAAAA //本机模块地址 #define SEND_ADDR 0xBBBB //发送地址 #define LED1 P1_0 #define LED2 P1_1 /**************************************************/ static basicRfCfg_t basicRfConfig; // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; basicRfConfig.channel = RF_CHANNEL; basicRfConfig.myAddr = MY_ADDR; basicRfConfig.ackRequest = TRUE; while(basicRfInit(&basicRfConfig) == FAILED); basicRfReceiveOn(); } void initIO(void) { P1SEL &=~0x03; P1DIR |=0x03; LED1=1; LED2=1; } float getTemperature(void) { signed short int value; ADCCON3=(0x3E); ADCCON1 |=0x30; ADCCON1 |=0x40; while(!(ADCCON1 & 0x80)); value |=((int)ADCH<<6); if(value<0) value=0; return value*0.06229-311.43; } void getTemperature1(void) { char z; float avgTemp; unsigned char output[]=""; while(1) { LED1=1; avgTemp=getTemperature(); for(z=0;z<64;z++) { avgTemp +=getTemperature(); avgTemp=avgTemp/2; } output[0]=(unsigned char)(avgTemp)/10 + 48; output[1]=(unsigned char)(avgTemp)%10 + 48; output[2]='\0'; } } /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 initIO(); uint8 a[128],c[128],len,output; while(1) { /* user code start */ len=halUartRxLen(); if(len>=2) { a[0]=len; halUartRead(&a[1],len); basicRfSendPacket(SEND_ADDR,a,len+1); } if(basicRfPacketIsReady()) { basicRfReceive(c,128,NULL); halUartWrite(&c[1],c[0]); if(c[1]==0xaa) { if(c[2]==0x01) { LED1=~LED1; LED2=LED2; } else if(c[2]==0x02) { LED2=~LED2; LED1=LED1; } else if(c[2]==0x03) { getTemperature1(); UART0SendString(output); UART0SendString("℃\t\r\n"); LED1=0; delay(2000); } { } } } /* user code end */ } }

这段代码存在一些问题: 1. 在函数 `getTemperature1()` 中,无限循环导致后面的代码无法运行。 2. 在函数 `getTemperature1()` 中,将浮点数转换为字符串的代码是错误的,应该使用 `sprintf` 函数。 3. 在函数 `main()` 中,变量 `output` 没有被初始化,导致在调用 `UART0SendString` 函数时会出现错误。 4. 在函数 `main()` 中,存在一个多余的空代码块。 5. 在函数 `main()` 中,调用了 `delay` 函数,但是该函数的声明和实现都没有给出,需要添加。 6. 在函数 `main()` 中,对变量 `len` 的使用可能会出现错误,因为 `halUartRxLen` 函数返回的是 `uint16` 类型,而 `len` 的类型是 `uint8`。 7. 在函数 `main()` 中,调用 `halUartRead` 函数时,第三个参数应该是 `len` 而不是 `len+1`。 8. 在函数 `main()` 中,调用 `UART0SendString` 函数时,应该将要发送的字符串作为参数传入,而不是将未初始化的变量 `output` 作为参数传入。 9. 在函数 `main()` 中,没有对变量 `a`、`c`、`len`、`output` 进行初始化,需要在主函数开头进行初始化。 10. 函数调用之间的空格和缩进不一致,需要进行统一。 下面是修改后的代码:

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdint.h> uint32_t random_advdata(void) { int i; uint8_t ykAdvData1[] = { 0x04, GAP_ADTYPE_LOCAL_NAME_SHORT, 'S', 'M', 'C', 0x09, GAP_ADTYPE_MANUFACTURER_SPECIFIC, //Company Identifier 0x06, 0xff, //Additional Data 0x00, 0x00, 0x00, 0x00, 0x3B, }; //Generate random number seeds srand((unsigned)time(NULL)); //Generate 4 random numbers and store them in ykAdvData for(int i = 0; i < 4; i++) { int random_num = rand(); ykAdvData1[9+i] = random_num & 0xFF; printf("ykAdvData[9+%d] = 0x%x", i, ykAdvData1[9+i]); } return ykAdvData1; } int main() { uint32_t yk_ADV[15]; yk_ADV = random_advdata(); }

这段代码存在一些问题,其中最明显的问题是函数random_advdata()的返回类型与实际返回值不匹配。函数返回的是一个uint8_t类型的数组指针,而返回类型却是一个uint32_t类型的整数。 此外,在函数内部使用了一个局部数组ykAdvData1,该数组的指针被返回给了函数外部使用,这是不安全的做法。因为该数组是在函数栈上分配的,函数结束后该数组就会被销毁,返回其指针是没有意义的。 还有一个问题是,函数内部没有分配动态内存,因此函数返回的指针也无法在函数外部正确地访问。如果想要在函数外部使用该数组,应该在函数内部使用malloc分配一段动态内存,将数组复制到该内存中,并返回该内存的指针。 最后,printf语句中应该加上换行符,以便在输出多个值时区分每个值。
阅读全文

相关推荐

#include "stm32f10x.h" #include <system_stm32f10x.h> #include <stdio.h> #include "usart.h" uint8_t uart3_cmd; void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; while(i--) ; } } void RCC_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init (GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE,GPIO_Pin_3); } struct student { char* name; int age; char sex; int num; }; typedef struct { char* name; int age; char sex; int num; } student_t; typedef union{ uint16_t word16; uint8_t byte_array[2]; } word_byte; typedef union{ uint16_t word16; struct { uint8_t acc_x; uint8_t acc_y; } acc_data; } acc_t; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); USART3_Init(UART3_BAUD); RCC_Configuration(); GPIO_Configuration(); uint8_t data_array[8]; uint16_t data1_array[8]; uint16_t word16,data_h,data_m,data_l; uint32_t word32; word_byte data5; acc_t data6; printf("char = %d", sizeof(char)); printf("unsigned short = %d", sizeof(unsigned short)); printf("int = %d", sizeof(int)); printf("float = %d", sizeof(float)); printf("double = %d", sizeof(double)); printf("char * = %d", sizeof(char *)); printf("int * = %d", sizeof(int *)); printf("data_array = %d", sizeof(data_array)); printf("data1_array = %d", sizeof(data1_array)); data_h = 0x08; data_m = 0x07; data_l = 0x06; word32=(data_h<<16)|(data_m<<8)|data_l; printf("word32=0x%x\r\n",word32); word32 = 0x080706; data_l = word32 & 0xFF; data_m = (word32 >> 8) & 0xFF; data_h = (word32 >> 16) & 0xFF; printf("data_h = 0x%x", data_h); printf("data_m = 0x%x", data_m); printf("data_l = 0x%x", data_l); student_t d={"jiaghaiyang",19,'M',2023305096}; printf ("name = %s, age = %d, sex = %c, num = %d",d.name,d.age,d.sex,d.num); # if 1 while(1) { switch(uart3_cmd) { case 1: printf("uart3_cmd =%d\r\n",uart3_cmd); GPIO_SetBits(GPIOE,GPIO_Pin_3); break; case 2: printf("uart3_cmd =%d\r\n",uart3_cmd); GPIO_ResetBits(GPIOE,GPIO_Pin_3); break; default: break; } delay_ms(1000); } # endif while(1); }请帮我根据以上代码写一篇实验总结400字

#include "afe4300.h" #include <stdio.h> #include <math.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "driver/spi_master.h" #include "esp_log.h" // --- AFE4300寄存器地址 --- #define ADC_DATA_RESULT 0x00 #define ADC_CONTROL_REGISTER 0x01 #define MISC1_REGISTER 0x02 #define MISC2_REGISTER 0x03 #define DEVICE_CONTROL_1 0x09 #define ISW_MATRIX 0x0A #define VSW_MATRIX 0x0B #define IQ_MODE_ENABLE 0x0C #define WEIGHT_SCALE_CONTROL 0x0D #define BCM_DAC_FREQ 0x0E #define DEVICE_CONTROL_2 0x0F #define ADC_CONTROL_REGISTER_2 0x10 #define MISC3_REGISTER 0x1A static const char* TAG = "AFE4300"; static spi_device_handle_t afe4300_spi; uint8_t testbuff[12*4]; const uint16_t isw_mux_reg[] = {0x0408, 0x1020, 0x4080}; const uint16_t vsense_mux_reg[] = {0x0408, 0x1020, 0x4080}; static esp_err_t spiWrite(uint8_t addr, uint16_t data) { uint8_t tx[3] = {addr, (uint8_t)(data >> 8), (uint8_t)data}; spi_transaction_t t = {.length = 24, .tx_buffer = tx}; esp_err_t ret = spi_device_transmit(afe4300_spi, &t); if (ret != ESP_OK) ESP_LOGE(TAG, "SPI写失败 addr=0x%02X", addr); return ret; } static uint16_t spiRead(uint8_t addr) { uint8_t tx[3] = {addr | 0x20, 0, 0}; uint8_t rx[3] = {0}; spi_transaction_t t = {.length = 24, .tx_buffer = tx, .rx_buffer = rx}; esp_err_t ret = spi_device_transmit(afe4300_spi, &t); if (ret != ESP_OK) { ESP_LOGE(TAG, "SPI读失败 addr=0x%02X", addr); return 0xFFFF; } return (rx[1] << 8) | rx[2]; } static void gpio_init(void) { gpio_config_t out_cfg = { .pin_bit_mask = ((1ULL << AFE4300_SCLK_PIN) | (1ULL << AFE4300_MOSI_PIN) | (1ULL << AFE4300_CS_PIN) | (1ULL << AFE4300_RESET_PIN)), .mode = GPIO_MODE_OUTPUT, .pull_up_en = GPIO_PULLUP_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE }; gpio_config(&out_cfg); gpio_config_t in_cfg = { .pin_bit_mask = ((1ULL << AFE4300_MISO_PIN) | (1ULL << AFE4300_RDY_PIN)), .mode = GPIO_MODE_INPUT, .pull_up_en = GPIO_PULLUP_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE }; gpio_config(&in_cfg); gpio_set_level(AFE4300_CS_PIN, 1); gpio_set_level(AFE4300_RESET_PIN, 1); } static esp_err_t spi_init(void) { spi_bus_config_t buscfg = { .mosi_io_num = AFE4300_MOSI_PIN, .miso_io_num = AFE4300_MISO_PIN, .sclk_io_num = AFE4300_SCLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1 }; ESP_ERROR_CHECK(spi_bus_initialize(AFE4300_SPI_HOST, &buscfg, SPI_DMA_DISABLED)); spi_device_interface_config_t devcfg = { .clock_speed_hz = AFE4300_SPI_FREQ_HZ, .mode = 1, .spics_io_num = AFE4300_CS_PIN, .queue_size = 7, .cs_ena_pretrans = 1, .cs_ena_posttrans = 1 }; return spi_bus_add_device(AFE4300_SPI_HOST, &devcfg, &afe4300_spi); } void afe4300_reset(void) { gpio_set_level(AFE4300_RESET_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(AFE4300_RESET_PIN, 1); vTaskDelay(pdMS_TO_TICKS(100)); spiWrite(MISC1_REGISTER, 0); spiWrite(MISC2_REGISTER, 0xFFFF); spiWrite(MISC3_REGISTER, 0x30); } static void afe4300_config(void) { spiWrite(ADC_CONTROL_REGISTER, 0x4170); spiWrite(DEVICE_CONTROL_1, 0x6006); spiWrite(ISW_MATRIX, 0x0408); spiWrite(VSW_MATRIX, 0x0408); spiWrite(ADC_CONTROL_REGISTER_2, 0x0063); spiWrite(WEIGHT_SCALE_CONTROL, 0x0000); spiWrite(BCM_DAC_FREQ, 0x0020); spiWrite(DEVICE_CONTROL_2, 0x1800); spiWrite(IQ_MODE_ENABLE, 0x0800); ESP_LOGI(TAG, "AFE4300 初始化完成"); } static void set_frequency(int freq_khz, bool enable_iq) { uint16_t freq_val = 0; uint16_t dev_ctrl2_val = 0; switch (freq_khz) { case 8: freq_val = 0x08; dev_ctrl2_val = enable_iq ? 0x2800 : 0; break; case 16: freq_val = 0x10; dev_ctrl2_val = enable_iq ? 0x2000 : 0; break; case 32: freq_val = 0x20; dev_ctrl2_val = enable_iq ? 0x1800 : 0; break; case 64: freq_val = 0x40; dev_ctrl2_val = enable_iq ? 0x1000 : 0; break; case 128: freq_val = 0x80; dev_ctrl2_val = enable_iq ? 0x0800 : 0; break; default: freq_val = freq_khz; dev_ctrl2_val = enable_iq ? 0x0000 : 0; break; } spiWrite(BCM_DAC_FREQ, freq_val); spiWrite(DEVICE_CONTROL_2, dev_ctrl2_val); } static uint16_t read_average(uint8_t addr, uint8_t count) { int sum = 0; for (uint8_t i = 0; i < count; i++) { sum += spiRead(addr); } return sum / count; } static void IQ_read(uint16_t out_channel, uint16_t in_channel, int16_t *result_I, int16_t *result_Q) { const uint16_t modes[] = {0x0063, 0x0065}; spiWrite(IQ_MODE_ENABLE, 0x0800); set_frequency(32, true); spiWrite(ISW_MATRIX, out_channel); spiWrite(VSW_MATRIX, in_channel); for (uint8_t i = 0; i < 2; i++) { spiWrite(ADC_CONTROL_REGISTER_2, modes[i]); vTaskDelay(pdMS_TO_TICKS(200)); int data = read_average(ADC_DATA_RESULT, 20); if (i == 0) *result_I = (int16_t)data; else *result_Q = (int16_t)data; } } const uint16_t ch_cal[] = {0x0201,0x0202,0x0101,0x0102};//RP1RN0,RP1RN1,RP0RN0,RP0RN1 //const uint16_t isw_mux_reg[] = {OUTPUT_DIFF_CHANNEL_13, OUTPUT_DIFF_CHANNEL_13, OUTPUT_DIFF_CHANNEL_10, OUTPUT_DIFF_CHANNEL_40, OUTPUT_DIFF_CHANNEL_15, OUTPUT_DIFF_CHANNEL_45, OUTPUT_DIFF_CHANNEL_05, OUTPUT_DIFF_CHANNEL_24}; //const uint16_t vsense_mux_reg[] = {INPUT_DIFF_CHANNEL_24, INPUT_DIFF_CHANNEL_13, INPUT_DIFF_CHANNEL_10, INPUT_DIFF_CHANNEL_40, INPUT_DIFF_CHANNEL_15, INPUT_DIFF_CHANNEL_45, INPUT_DIFF_CHANNEL_05, INPUT_DIFF_CHANNEL_24 }; uint8_t testbuff[12*4]; void bcm_ref_iq(void) { uint8_t i=0,j=0; volatile short datai_adc; volatile short dataq_adc; for(i=0;i<4;i++) { spiWrite(0x0A,ch_cal[i]); //OUTPUT spiWrite(0x0B,ch_cal[i]); //INPUT spiWrite(0x10,0x0063); //ADC_FOR_BCM_CHANNELI vTaskDelay(pdMS_TO_TICKS(200)); datai_adc = read_average(0x00, 20); spiWrite(0x10,0x0065); //ADC_FOR_BCM_CHANNELQ vTaskDelay(pdMS_TO_TICKS(200)); dataq_adc = read_average(0x00, 20); testbuff[j++] = datai_adc >> 8; testbuff[j++] = datai_adc & 0xff; testbuff[j++] = dataq_adc >> 8; testbuff[j++] = dataq_adc & 0xff; } } void bcm_measurement_iq(void) { int16_t result_I, result_Q; uint8_t j=16; bcm_ref_iq(); for (uint8_t i=0; i<sizeof(isw_mux_reg)/sizeof(isw_mux_reg[0]); i++) { result_I = 0; result_Q = 0; IQ_read(isw_mux_reg[i], vsense_mux_reg[i], &result_I, &result_Q); testbuff[j++] = result_I >> 8; testbuff[j++] = result_I & 0xff; testbuff[j++] = result_Q >> 8; testbuff[j++] = result_Q & 0xff; } } void zref_calc_test(uint8_t* rawdata, float* caldata) { uint8_t i,j; static const float realy[4]={99.1,196.4,699.1,950.2};//{99,195,696,947};//{99.1,196.4,699.1,950.2};//{98.7,196.6,698.1,949.2};//x[4]={29,55,188,255}; float datai, dataq, theta_tmp[12], z_tmp[12]; float lxx, lxy, sum_x, sum_y, avg_x, avg_y, avg_theta; float aref, bref, theta; lxx = lxy = sum_x = sum_y = avg_theta = aref = bref = theta = 0.0; for (i=0, j=0; i < 48; i=i+4, j++) { datai = (float)((rawdata[i] << 8) + rawdata[i + 1])* 0.0518799; dataq = (float)((rawdata[i + 2] << 8) + rawdata[i + 3])* 0.0518799; //ESP_LOGI("AFE4300","#####cal: datai =%.2f, dataq =%.2f\n",datai,dataq); theta_tmp[j] = 57.2957795f * atan2f(dataq, datai); // 浣跨敤atan2閬垮厤闄ら浂閿欒 z_tmp[j] = sqrtf(datai * datai + dataq * dataq); //* (1.7f / 32768.0f); //ESP_LOGI("AFE4300","#####cal: ampli[%d] =%.2f, theta[%d] =%.2f\n", j,z_tmp[j],j, theta_tmp[j]); } for (i = 0; i < 4; i++) { sum_x += z_tmp[i]; sum_y += realy[i]; avg_theta += theta_tmp[i]; } avg_x = sum_x / 4.0; avg_y = sum_y / 4.0; theta = avg_theta / 4.0; for (i = 0; i != 4; i++) { lxx += (z_tmp[i] - avg_x) * (z_tmp[i] - avg_x); lxy += (z_tmp[i] - avg_x) * (realy[i] - avg_y); } bref = lxy / lxx; aref = avg_y - bref * avg_x; ESP_LOGI("AFE4300","__linear_regression: Y = %.2fx + %.2f, theta(avg) = %.2f\n", bref, aref, theta); for (i=4,j=0; i < 12; i++, j=j+2) { caldata[j] = z_tmp[i] * bref + aref; caldata[j+1] = theta_tmp[i] - theta; } } static void bcm_iq_test_task(void* arg) { float caldata[16]; while (1) { bcm_measurement_iq(); zref_calc_test(testbuff, caldata); for (uint8_t i = 0; i < 16; i=i+2) { ESP_LOGI("AFE4300","__aftercal_iq: Z = %.2f, theta = %.2f\n", caldata[i], caldata[i+1]); } vTaskDelay(pdMS_TO_TICKS(2000)); } } esp_err_t afe4300_init(void) { gpio_init(); esp_err_t ret = spi_init(); if (ret != ESP_OK) { ESP_LOGE(TAG, "SPI 初始化失败"); return ret; } afe4300_reset(); afe4300_config(); return ESP_OK; } void afe4300_start_task(void) { xTaskCreate(bcm_iq_test_task, "bcm_iq_test", 4096, NULL, 5, NULL); } 测试得到I (462) AFE4300: AFE4300 初始化完成 I (462) main_task: Returned from app_main() I (3262) AFE4300: __linear_regression: Y = -3.56x + 12072.35, theta(avg) = 84.73  I (3262) AFE4300: __aftercal_iq: Z = 72.75, theta = 4.30  I (3262) AFE4300: __aftercal_iq: Z = 208.02, theta = 3.31 其中 Y = -3.56x + 12072.35明显不对,12072.35太大了

根据lcd.c: #include “lcd.h” #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <stdlib.h> //全局变量 int fd_lcd; //帧缓冲设备文件的文件描述符 int fb_size = 8004804; //帧缓冲设备文件的大小 unsigned int *pmap; //映射区首地址 /******************************************** 功能:初始化LCD显示屏 返回值: -1:失败 0:成功 参数:无 ********************************************/ int lcdInit() { //打开帧缓冲设备文件(/dev/fb0) fd_lcd = open(“/dev/fb0”,O_RDWR); if (-1 == fd_lcd) { perror(“open lcd error”); return -1; } //映射 pmap = mmap(NULL, fb_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd_lcd, 0); if (MAP_FAILED == pmap) { //映射失败 perror(“mmap error”); close(fd_lcd); return -1; } return 0; } /******************************************** 功能:关闭LCD显示屏 返回值:无 参数:无 ********************************************/ void lcdClose() { //解除映射,释放内存 munmap(pmap, fb_size); //关闭帧缓冲设备文件 close(fd_lcd); } /******************************************** 功能:显示背景颜色 返回值:无 参数: color:要显示的颜色值 ********************************************/ void lcdBrushBG(unsigned int color) { for (int y = 0; y < 480; y++) { for (int x = 0; x < 800; x++) { (pmap + y800 + x) = color; } } } /******************************************** 功能:在指定的位置像素点 返回值:无 参数: x,y:像素点的坐标 color:像素点显示的颜色值 ********************************************/ void lcdDrawPoint(int x,int y,unsigned int color) { if (x >= 0 && x < 800 && y >= 0 && y < 480) { //是屏幕范围内的点,画像素点 (pmap + y800 + x) = color; } } /******************************************** 功能:在指定的位置画矩形(实心) 返回值:无 参数: x0,y0:矩形显示的位置(左上顶点的坐标) w,h:矩形的宽度和高度 color:矩形的颜色值 ********************************************/ void lcdDrawRect(int x0,int y0,int w,int h,unsigned int color) { for (int y = y0; y < y0+h; y++) { for (int x = x0; x < x0+w; x++) { lcdDrawPoint(x,y,color); } } } /******************************************** 功能:在指定的位置画圆形(实心) 返回值:无 参数: x0,y0:圆心的坐标 r:半径 color:圆的颜色值 ********************************************/ void lcdDrawCircle(int x0,int y0,int r,unsigned int color) { for (int y = y0-r; y < y0+r; y++) { for (int x = x0-r; x < x0+r; x++) { if ((y-y0)(y-y0)+(x-x0)(x-x0) <= r*r) { //这个坐标到圆心的距离小于等于半径(是圆内的点) lcdDrawPoint(x,y,color); } } } } /******************************************** 功能:在指定的位置显示文字 返回值:无 参数: x0,y0:文字显示的位置(左上顶点的坐标) word:文字取模结果的首地址 w,h:文字的宽度和高度(像素点个数) color:文字的颜色值 ********************************************/ void lcdDrawWord(int x0,int y0,unsigned char word,int w,int h,unsigned int color) { //遍历取模结果 int bytes_line = w/8; //每一行数据需要用多少个字节来保存 for (int i = 0; i < w/8h; i++) { //每一个字节的数据对应8个像素点的状态 for (int j = 0; j <= 7; j++) { if(word[i]>>7-j & 0x01) { //是文字上的点,画像素点 int x = j + (i%bytes_line)*8 + x0; int y = i/bytes_line + y0; lcdDrawPoint(x,y,color); } } } } /******************************************** 功能:在指定的位置显示字符串(每个汉字占3个字节) 返回值:无 参数: x0,y0:字符串显示的位置(第一字符左上顶点的坐标) count:要显示的字符个数 word:字符串取模结果的首地址 w,h:字符的宽度和高度(像素点个数) color:字符的颜色值 ********************************************/ void lcdDrawStr(int x0,int y0,int count,unsigned char word,int w,int h,unsigned int color) { //逐个显示字符 for (int i = 0; i < count; i++) { lcdDrawWord(x0+iw,y0,word+iwh/8,w,h,color); } } /******************************************** 功能:在指定的位置显示数字(正整数) 返回值:无 参数: x0,y0:数字显示的位置(左边第一个数字左上顶点的坐标) number:要显示的数字值 word:数字0~9取模结果的首地址 w,h:数字的宽度和高度(像素点个数) color:数字的颜色值 ********************************************/ void lcdDrawNumber(int x0,int y0,int number,unsigned char *word,int w,int h,unsigned int color) { if (number < 0) { return; } //提取数字各位的值 char bits[20] = {0}; //保存数字各位的值 int wei = 0; //记录数字的位数 //如果数字是0,那么就是一个一位数 if (number == 0) { wei = 1; } //循环获取数字个位的数,直到number为0 while (number) { bits[wei++] = number%10; //提取个位数 number /= 10; //去除个位数 } //显示数字 for (int i = wei-1; i >= 0; i–) { lcdDrawWord(x0+(wei-1-i)*w,y0,word+bits[i]wh/8,w,h,color); } } /******************************************** 功能:在指定的位置显示BMP图片 返回值:无 参数: x0,y0:图片显示的位置(左上顶点的坐标) pic_path:要显示的图片文件的路径名 ********************************************/ void lcdDrawBMP(int x0,int y0,char pic_path) { //打开图片文件 int fd_pic = open(pic_path,O_RDONLY); if (-1 == fd_pic) { perror(“open pic error”); return; } //读取图片的参数(魔数、像素数组文件偏移量、宽度、高度、色深) short MS,depth; //魔数、色深 int offset,w,h; //像素数组的文件偏移量、图片宽度、图片高度 read(fd_pic,&MS,2); //判断当前图片是不是BMP图片 if (0x4D42 != MS) { //不是BMP图片 printf(“this pic is not BMP!\n”); close(fd_pic); return; } lseek(fd_pic,0x0A,SEEK_SET); read(fd_pic,&offset,4); lseek(fd_pic,0x12,SEEK_SET); read(fd_pic,&w,4); read(fd_pic,&h,4); lseek(fd_pic,0x1C,SEEK_SET); read(fd_pic,&depth,2); if (depth < 24) { //该BMP图片是24位以下的BMP图片,当前代码不支持显示 printf(“The depth of this image is less than 24 bits and thus cannot be displayed.\n”); close(fd_pic); return; } // printf(“MS=0x%x,offset=0x%x,w=%d,h=%d,deepth=%d\n”,MS,offset,w,h,depth); //读取像素数组数据 int full_bytes_line = (4-(wdepth/8)%4)%4; //每一行填充的字节数 = (4 - 一行像素点颜色值的有效字节数%4)%4 int buf_size = (w*depth/8+full_bytes_line)*abs(h); //像素数组的大小 = 像素点颜色值的有效字节数+填充字节数 unsigned char buf[buf_size]; //用来保存像素数组数据 lseek(fd_pic,offset,SEEK_SET); read(fd_pic,buf,buf_size); //遍历图片上的每个像素点,将其颜色值提取出来按照argb的顺序重新排列组合,并显示到屏幕上去 unsigned char a,r,g,b; //4个颜色分量 unsigned char *p = buf; //为了方便访问数据,通过指针来访问 for (int y = 0; y < abs(h); y++) { for (int x = 0; x < w; x++) { //获取一个像素点的4个颜色分量值 b = *p++; g = *p++; r = *p++; if (depth == 24) { //是一个24位的BMP图片,只有3个颜色分量,a需要手动赋值 a = 0; } else if (depth == 32) { //是一个32位的BMP图片,有4个颜色分量,a可以直接获取 a = *p++; } //将这4个颜色分量按照 a r g b 的顺序重新排列组合成一个32位的颜色值 // a: 1001 1101 // r: 0101 0000 // g: 1010 0010 // b: 0000 1111 // a << 24: // 1010 1101 0000 0000 0000 0000 0000 0000 // r << 16: // 0101 0000 0000 0000 0000 0000 // g << 8: // 1010 0010 0000 0000 // b << 0: // 0000 1111 // a << 24 | r << 16 | g << 8 | b: // 1010 1101 0101 0000 1010 0010 0000 1111 unsigned int color = a << 24 | r << 16 | g << 8 | b; //将该像素点颜色值显示到屏幕上去 if (h > 0) { //图像在保存的时候是从下往上保存的,显示也要从下往上显示 lcdDrawPoint(x+x0,h-1-y+y0,color); } else { lcdDrawPoint(x+x0,y+y0,color); } } //每显示完一行像素点的颜色值,就需要跳过后面的填充数据 p += full_bytes_line; } //关闭图片文件 close(fd_pic); } 及serial.c: #include <string.h> #include <termios.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> //初始化串口 //file: 串口所对应的文件名 //baudrate:波特率 //返回值:成功返回串口设备文件描述符,失败返回-1 int init_serial(const char *file, int baudrate) { int fd; fd = open(file, O_RDWR); if (fd == -1) { perror("open device error:"); return -1; } struct termios myserial; //清空结构体 memset(&myserial, 0, sizeof (myserial)); //O_RDWR myserial.c_cflag |= (CLOCAL | CREAD); //设置控制模式状态,本地连接,接受使能 //设置 数据位 myserial.c_cflag &= ~CSIZE; //清空数据位 myserial.c_cflag &= ~CRTSCTS; //无硬件流控制 myserial.c_cflag |= CS8; //数据位:8 myserial.c_cflag &= ~CSTOPB;// //1位停止位 myserial.c_cflag &= ~PARENB; //不要校验 //myserial.c_iflag |= IGNPAR; //不要校验 //myserial.c_oflag = 0; //输入模式 //myserial.c_lflag = 0; //不激活终端模式 switch (baudrate) { case 9600: cfsetospeed(&myserial, B9600); //设置波特率 cfsetispeed(&myserial, B9600); break; case 115200: cfsetospeed(&myserial, B115200); //设置波特率 cfsetispeed(&myserial, B115200); break; case 19200: cfsetospeed(&myserial, B19200); //设置波特率 cfsetispeed(&myserial, B19200); break; } /* 刷新输出队列,清除正接受的数据 */ tcflush(fd, TCIFLUSH); /* 改变配置 */ tcsetattr(fd, TCSANOW, &myserial); lcdClose(); return fd; } 在这个函数main.c: #include <string.h> #include <termios.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> //初始化串口 //file: 串口所对应的文件名 //baudrate:波特率 //返回值:成功返回串口设备文件描述符,失败返回-1 int init_serial(const char *file, int baudrate) { int fd; fd = open(file, O_RDWR); if (fd == -1) { perror(“open device error:”); return -1; } struct termios myserial; //清空结构体 memset(&myserial, 0, sizeof (myserial)); //O_RDWR myserial.c_cflag |= (CLOCAL | CREAD); //设置控制模式状态,本地连接,接受使能 //设置 数据位 myserial.c_cflag &= ~CSIZE; //清空数据位 myserial.c_cflag &= ~CRTSCTS; //无硬件流控制 myserial.c_cflag |= CS8; //数据位:8 myserial.c_cflag &= ~CSTOPB;// //1位停止位 myserial.c_cflag &= ~PARENB; //不要校验 //myserial.c_iflag |= IGNPAR; //不要校验 //myserial.c_oflag = 0; //输入模式 //myserial.c_lflag = 0; //不激活终端模式 switch (baudrate) { case 9600: cfsetospeed(&myserial, B9600); //设置波特率 cfsetispeed(&myserial, B9600); break; case 115200: cfsetospeed(&myserial, B115200); //设置波特率 cfsetispeed(&myserial, B115200); break; case 19200: cfsetospeed(&myserial, B19200); //设置波特率 cfsetispeed(&myserial, B19200); break; } /* 刷新输出队列,清除正接受的数据 / tcflush(fd, TCIFLUSH); / 改变配置 */ tcsetattr(fd, TCSANOW, &myserial); return fd; } int main() { //初始化串口(如:设备文件/dev/ttySAC1,波特率9600) int fd_gy39 = init_serial(“/dev/ttySAC1”,9600); if (-1 == fd_gy39) { printf(“GY39 init error!\n”); return -1; } //发送命令(如:0xA5 0x83 0x28) unsigned char cmd[3] = {0xA5,0x83,0x28}; //同时获取光照强度数据和温湿度数据 //往设备文件中写入命令(发送命令) write(fd_gy39,cmd,3); //循环读取传感器数据 ssize_t ret; while (1) { sleep(1); unsigned char data[9+15] = {0}; //光照强度数据9个字节,温湿度数据15个字节 ret = read(fd_gy39,data,sizeof(data)); if (-1 == ret) { //读取GY39数据失败 perror(“read data from GY39 error”); close(fd_gy39); return -1; } else if (ret == 0) { //没有读到数据 printf(“No data was read.\n”); sleep(1); continue; } else if (sizeof(data) != ret) { //读取到的数据长度不正确,数据不完整,放弃这条数据,重新读 printf(“The data is incomplete.\n”); printf(“sizeof(data)=%d,ret=%ld\n”,sizeof(data),ret); continue; } //分析计算传感器数据 if (data[2] == 0x15) { //光照强度数据在前面 if (data[0] != 0x5A && data[1] != 0x5A && data[9] != 0x5A && data[10] != 0x5A) { //数据不是以0x5A开头,数据不完整,放弃这条数据,重新读 printf(“Error in data: data[0]=0x%x data[1]=0x%x,data[9]=0x%x,data[10]=0x%x”); continue; } //计算光照强度数据 float LUX = (data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7])/100; //计算温度 float T = (data[13] << 8 | data[14])/100; //打印或者显示数据 printf(“LUX=%.2f,T=%.2f\n”,LUX,T); } else { //温湿度等数据在前面 if (data[0] != 0x5A && data[1] != 0x5A && data[15] != 0x5A && data[16] != 0x5A) { //数据不是以0x5A开头,数据不完整,放弃这条数据,重新读 // printf(“data[0]=0x%x data[1]=0x%x,data[9]=0x%x,data[10]=0x%x”); continue; } } } //关闭串口文件 close(fd_gy39); return 0; } 在此程序上修改获取传感器数据,并显示到GEC6818开发板屏幕上去,要显示名称和单位

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "ImageInverse.h" #include "bmp_head_struct.h" image_inverse_create_t inverse_create; image_inverse_frame_t inverse_frame; image_inverse_state_t inverse_state; BITMAPFILEHEADER *p_bmpFileHead; // 14 B BITMAPINFOHEADER *p_bmpInfoHead; // 40 B void *handle; /* * main.c */ int main(void) { int SizeImage; int width,height; FILE *file_src = NULL; FILE *file_dst = NULL; BYTE *p_src = NULL, *p_dst = NULL; clock_t begin,end; printf("---Image Inverse Processing!\n"); file_src = fopen("..//bmps//HazyDay1.bmp","rb"); if (!file_src){ printf("file_src open error!\n"); return -1; } file_dst = fopen("..//bmps//HazyDay1_inverse.bmp","wb"); if (!file_dst){ printf("file_dst open error!\n"); return -1; } p_bmpFileHead = (BITMAPFILEHEADER *)malloc(14); p_bmpInfoHead = (BITMAPINFOHEADER *)malloc(40); #if 1 //条件编译 fread(p_bmpFileHead, 1, 14, file_src); #else fread(&p_bmpFileHead->bfType,1,2,file_src); fread(&p_bmpFileHead->bfSize,1,4,file_src); fread(&p_bmpFileHead->bfReserved1,1,2,file_src); fread(&p_bmpFileHead->bfReserved2,1,2,file_src); fread(&p_bmpFileHead->bfOffBits,1,4,file_src); #endif fread(p_bmpInfoHead, 1, 40, file_src); width = p_bmpInfoHead->biWidth; height= p_bmpInfoHead->biHeight; SizeImage = width*height*3; p_src = (BYTE *)malloc(SizeImage); p_dst = (BYTE *)malloc(SizeImage); if ((!p_src) || (!p_dst)){ printf("error in malloc for image data!\n"); return -1; } //1.-----------------------------------------------------------------create inverse_create.width = width; inverse_create.height= height; begin = clock(); image_inverse(NULL, DSP_ALG_CREATE, &inverse_create, NULL); end = clock(); //printf("DSP_ALG_CREATE = %d",end - begin); handle = inverse_create.handle; fread(p_src, 1, Size

根据lcd.c #include "lcd.h" #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <stdlib.h> //全局变量 int fd_lcd; //帧缓冲设备文件的文件描述符 int fb_size = 800*480*4; //帧缓冲设备文件的大小 unsigned int *pmap; //映射区首地址 /******************************************** * 功能:初始化LCD显示屏 * 返回值: * -1:失败 * 0:成功 * 参数:无 ********************************************/ int lcdInit() { //打开帧缓冲设备文件(/dev/fb0) fd_lcd = open("/dev/fb0",O_RDWR); if (-1 == fd_lcd) { perror("open lcd error"); return -1; } //映射 pmap = mmap(NULL, fb_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd_lcd, 0); if (MAP_FAILED == pmap) { //映射失败 perror("mmap error"); close(fd_lcd); return -1; } return 0; } /******************************************** * 功能:关闭LCD显示屏 * 返回值:无 * 参数:无 ********************************************/ void lcdClose() { //解除映射,释放内存 munmap(pmap, fb_size); //关闭帧缓冲设备文件 close(fd_lcd); } /******************************************** * 功能:显示背景颜色 * 返回值:无 * 参数: * color:要显示的颜色值 ********************************************/ void lcdBrushBG(unsigned int color) { for (int y = 0; y < 480; y++) { for (int x = 0; x < 800; x++) { *(pmap + y*800 + x) = color; } } } /******************************************** * 功能:在指定的位置像素点 * 返回值:无 * 参数: * x,y:像素点的坐标 * color:像素点显示的颜色值 ********************************************/ void lcdDrawPoint(int x,int y,unsigned int color) { if (x >= 0 && x < 800 && y >= 0 && y < 480) { //是屏幕范围内的点,画像素点 *(pmap + y*800 + x) = color; } } /******************************************** * 功能:在指定的位置画矩形(实心) * 返回值:无 * 参数: * x0,y0:矩形显示的位置(左上顶点的坐标) * w,h:矩形的宽度和高度 * color:矩形的颜色值 ********************************************/ void lcdDrawRect(int x0,int y0,int w,int h,unsigned int color) { for (int y = y0; y < y0+h; y++) { for (int x = x0; x < x0+w; x++) { lcdDrawPoint(x,y,color); } } } /******************************************** * 功能:在指定的位置画圆形(实心) * 返回值:无 * 参数: * x0,y0:圆心的坐标 * r:半径 * color:圆的颜色值 ********************************************/ void lcdDrawCircle(int x0,int y0,int r,unsigned int color) { for (int y = y0-r; y < y0+r; y++) { for (int x = x0-r; x < x0+r; x++) { if ((y-y0)*(y-y0)+(x-x0)*(x-x0) <= r*r) { //这个坐标到圆心的距离小于等于半径(是圆内的点) lcdDrawPoint(x,y,color); } } } } /******************************************** * 功能:在指定的位置显示文字 * 返回值:无 * 参数: * x0,y0:文字显示的位置(左上顶点的坐标) * word:文字取模结果的首地址 * w,h:文字的宽度和高度(像素点个数) * color:文字的颜色值 ********************************************/ void lcdDrawWord(int x0,int y0,unsigned char *word,int w,int h,unsigned int color) { //遍历取模结果 int bytes_line = w/8; //每一行数据需要用多少个字节来保存 for (int i = 0; i < w/8*h; i++) { //每一个字节的数据对应8个像素点的状态 for (int j = 0; j <= 7; j++) { if(word[i]>>7-j & 0x01) { //是文字上的点,画像素点 int x = j + (i%bytes_line)*8 + x0; int y = i/bytes_line + y0; lcdDrawPoint(x,y,color); } } } } /******************************************** * 功能:在指定的位置显示字符串(每个汉字占3个字节) * 返回值:无 * 参数: * x0,y0:字符串显示的位置(第一字符左上顶点的坐标) * count:要显示的字符个数 * word:字符串取模结果的首地址 * w,h:字符的宽度和高度(像素点个数) * color:字符的颜色值 ********************************************/ void lcdDrawStr(int x0,int y0,int count,unsigned char *word,int w,int h,unsigned int color) { //逐个显示字符 for (int i = 0; i < count; i++) { lcdDrawWord(x0+i*w,y0,word+i*w*h/8,w,h,color); } } /******************************************** * 功能:在指定的位置显示数字(正整数) * 返回值:无 * 参数: * x0,y0:数字显示的位置(左边第一个数字左上顶点的坐标) * number:要显示的数字值 * word:数字0~9取模结果的首地址 * w,h:数字的宽度和高度(像素点个数) * color:数字的颜色值 ********************************************/ void lcdDrawNumber(int x0,int y0,int number,unsigned char *word,int w,int h,unsigned int color) { if (number < 0) { return; } //提取数字各位的值 char bits[20] = {0}; //保存数字各位的值 int wei = 0; //记录数字的位数 //如果数字是0,那么就是一个一位数 if (number == 0) { wei = 1; } //循环获取数字个位的数,直到number为0 while (number) { bits[wei++] = number%10; //提取个位数 number /= 10; //去除个位数 } //显示数字 for (int i = wei-1; i >= 0; i--) { lcdDrawWord(x0+(wei-1-i)*w,y0,word+bits[i]*w*h/8,w,h,color); } } /******************************************** * 功能:在指定的位置显示BMP图片 * 返回值:无 * 参数: * x0,y0:图片显示的位置(左上顶点的坐标) * pic_path:要显示的图片文件的路径名 ********************************************/ void lcdDrawBMP(int x0,int y0,char *pic_path) { //打开图片文件 int fd_pic = open(pic_path,O_RDONLY); if (-1 == fd_pic) { perror("open pic error"); return; } //读取图片的参数(魔数、像素数组文件偏移量、宽度、高度、色深) short MS,depth; //魔数、色深 int offset,w,h; //像素数组的文件偏移量、图片宽度、图片高度 read(fd_pic,&MS,2); //判断当前图片是不是BMP图片 if (0x4D42 != MS) { //不是BMP图片 printf("this pic is not BMP!\n"); close(fd_pic); return; } lseek(fd_pic,0x0A,SEEK_SET); read(fd_pic,&offset,4); lseek(fd_pic,0x12,SEEK_SET); read(fd_pic,&w,4); read(fd_pic,&h,4); lseek(fd_pic,0x1C,SEEK_SET); read(fd_pic,&depth,2); if (depth < 24) { //该BMP图片是24位以下的BMP图片,当前代码不支持显示 printf("The depth of this image is less than 24 bits and thus cannot be displayed.\n"); close(fd_pic); return; } // printf("MS=0x%x,offset=0x%x,w=%d,h=%d,deepth=%d\n",MS,offset,w,h,depth); //读取像素数组数据 int full_bytes_line = (4-(w*depth/8)%4)%4; //每一行填充的字节数 = (4 - 一行像素点颜色值的有效字节数%4)%4 int buf_size = (w*depth/8+full_bytes_line)*abs(h); //像素数组的大小 = 像素点颜色值的有效字节数+填充字节数 unsigned char buf[buf_size]; //用来保存像素数组数据 lseek(fd_pic,offset,SEEK_SET); read(fd_pic,buf,buf_size); //遍历图片上的每个像素点,将其颜色值提取出来按照argb的顺序重新排列组合,并显示到屏幕上去 unsigned char a,r,g,b; //4个颜色分量 unsigned char *p = buf; //为了方便访问数据,通过指针来访问 for (int y = 0; y < abs(h); y++) { for (int x = 0; x < w; x++) { //获取一个像素点的4个颜色分量值 b = *p++; g = *p++; r = *p++; if (depth == 24) { //是一个24位的BMP图片,只有3个颜色分量,a需要手动赋值 a = 0; } else if (depth == 32) { //是一个32位的BMP图片,有4个颜色分量,a可以直接获取 a = *p++; } //将这4个颜色分量按照 a r g b 的顺序重新排列组合成一个32位的颜色值 // a: 1001 1101 // r: 0101 0000 // g: 1010 0010 // b: 0000 1111 // a << 24: // 1010 1101 0000 0000 0000 0000 0000 0000 // r << 16: // 0101 0000 0000 0000 0000 0000 // g << 8: // 1010 0010 0000 0000 // b << 0: // 0000 1111 // a << 24 | r << 16 | g << 8 | b: // 1010 1101 0101 0000 1010 0010 0000 1111 unsigned int color = a << 24 | r << 16 | g << 8 | b; //将该像素点颜色值显示到屏幕上去 if (h > 0) { //图像在保存的时候是从下往上保存的,显示也要从下往上显示 lcdDrawPoint(x+x0,h-1-y+y0,color); } else { lcdDrawPoint(x+x0,y+y0,color); } } //每显示完一行像素点的颜色值,就需要跳过后面的填充数据 p += full_bytes_line; } //关闭图片文件 close(fd_pic); } main.c: #include <string.h> #include <termios.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> //初始化串口 //file: 串口所对应的文件名 //baudrate:波特率 //返回值:成功返回串口设备文件描述符,失败返回-1 int init_serial(const char *file, int baudrate) { int fd; fd = open(file, O_RDWR); if (fd == -1) { perror(“open device error:”); return -1; } struct termios myserial; //清空结构体 memset(&myserial, 0, sizeof (myserial)); //O_RDWR myserial.c_cflag |= (CLOCAL | CREAD); //设置控制模式状态,本地连接,接受使能 //设置 数据位 myserial.c_cflag &= ~CSIZE; //清空数据位 myserial.c_cflag &= ~CRTSCTS; //无硬件流控制 myserial.c_cflag |= CS8; //数据位:8 myserial.c_cflag &= ~CSTOPB;// //1位停止位 myserial.c_cflag &= ~PARENB; //不要校验 //myserial.c_iflag |= IGNPAR; //不要校验 //myserial.c_oflag = 0; //输入模式 //myserial.c_lflag = 0; //不激活终端模式 switch (baudrate) { case 9600: cfsetospeed(&myserial, B9600); //设置波特率 cfsetispeed(&myserial, B9600); break; case 115200: cfsetospeed(&myserial, B115200); //设置波特率 cfsetispeed(&myserial, B115200); break; case 19200: cfsetospeed(&myserial, B19200); //设置波特率 cfsetispeed(&myserial, B19200); break; } /* 刷新输出队列,清除正接受的数据 / tcflush(fd, TCIFLUSH); / 改变配置 */ tcsetattr(fd, TCSANOW, &myserial); return fd; } int main() { //初始化串口(如:设备文件/dev/ttySAC1,波特率9600) int fd_gy39 = init_serial(“/dev/ttySAC1”,9600); if (-1 == fd_gy39) { printf(“GY39 init error!\n”); return -1; } //发送命令(如:0xA5 0x83 0x28) unsigned char cmd[3] = {0xA5,0x83,0x28}; //同时获取光照强度数据和温湿度数据 //往设备文件中写入命令(发送命令) write(fd_gy39,cmd,3); //循环读取传感器数据 ssize_t ret; while (1) { sleep(1); unsigned char data[9+15] = {0}; //光照强度数据9个字节,温湿度数据15个字节 ret = read(fd_gy39,data,sizeof(data)); if (-1 == ret) { //读取GY39数据失败 perror(“read data from GY39 error”); close(fd_gy39); return -1; } else if (ret == 0) { //没有读到数据 printf(“No data was read.\n”); sleep(1); continue; } else if (sizeof(data) != ret) { //读取到的数据长度不正确,数据不完整,放弃这条数据,重新读 printf(“The data is incomplete.\n”); printf(“sizeof(data)=%d,ret=%ld\n”,sizeof(data),ret); continue; } //分析计算传感器数据 if (data[2] == 0x15) { //光照强度数据在前面 if (data[0] != 0x5A && data[1] != 0x5A && data[9] != 0x5A && data[10] != 0x5A) { //数据不是以0x5A开头,数据不完整,放弃这条数据,重新读 printf(“Error in data: data[0]=0x%x data[1]=0x%x,data[9]=0x%x,data[10]=0x%x”); continue; } //计算光照强度数据 float LUX = (data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7])/100; //计算温度 float T = (data[13] << 8 | data[14])/100; //打印或者显示数据 printf(“LUX=%.2f,T=%.2f\n”,LUX,T); } else { //温湿度等数据在前面 if (data[0] != 0x5A && data[1] != 0x5A && data[15] != 0x5A && data[16] != 0x5A) { //数据不是以0x5A开头,数据不完整,放弃这条数据,重新读 // printf(“data[0]=0x%x data[1]=0x%x,data[9]=0x%x,data[10]=0x%x”); continue; } } } //关闭串口文件 close(fd_gy39); return 0; } 在此程序上修改获取传感器数据,并显示到GEC6818开发板屏幕上去,要显示名称和单位, 实现手控灯和自控灯

大家在看

recommend-type

ELEC5208 Group project submissions.zip_furniturer4m_smart grid_悉

悉尼大学ELEC5208智能电网project的很多组的报告和code都在里面,供学习和参考
recommend-type

基于python单通道脑电信号的自动睡眠分期研究

【作品名称】:基于python单通道脑电信号的自动睡眠分期研究 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:网络结构(具体可查看network.py文件): 网络整体结构类似于TinySleepNet,对RNN部分进行了修改,增加了双向RNN、GRU、Attention等网络结构,可根据参数进行调整选择。 定义了seq_len参数,可以更灵活地调整batch_size与seq_len。 数据集加载(具体可查看dataset.py文件) 直接继承自torch的Dataset,并定义了seq_len和shuffle_seed,方便调整输入,并复现实验。 训练(具体可查看train.py文件): 定义并使用了focal loss损失函数 在实验中有使用wandb,感觉用起来还挺方便的,非常便于实验记录追溯 测试(具体可查看test.py文件): 可以输出accuracy、mf1、recall_confusion_matrics、precision_confusion_matrics、f1
recommend-type

bid格式文件电子标书阅读器.zip

软件介绍: bid格式招投标文件阅读器,可以打开浏览、管理电子招标文件,如果打不开标书文件,请按下面步骤检查:1、请查看招标文件(.bid文件)是否下载完全,请用IE下载工具下载;2、查看IE浏览器版本,如果版本低于IE8,低于IE8版本的请升级为IE8浏览器。
recommend-type

机器翻译WMT14数据集

机器翻译WMT14数据集,ACL2014公布的share task,很多模型都在这上benchmark
recommend-type

高通QXDM使用手册.pdf

高通QXDM使用手册,介绍高通QXDM工具软件的使用,中文版的哦。

最新推荐

recommend-type

C#类库封装:简化SDK调用实现多功能集成,构建地磅无人值守系统

内容概要:本文介绍了利用C#类库封装多个硬件设备的SDK接口,实现一系列复杂功能的一键式调用。具体功能包括身份证信息读取、人证识别、车牌识别(支持臻识和海康摄像头)、LED显示屏文字输出、称重数据读取、二维码扫描以及语音播报。所有功能均被封装为简单的API,极大降低了开发者的工作量和技术门槛。文中详细展示了各个功能的具体实现方式及其应用场景,如身份证读取、人证核验、车牌识别等,并最终将这些功能整合到一起,形成了一套完整的地磅称重无人值守系统解决方案。 适合人群:具有一定C#编程经验的技术人员,尤其是需要快速集成多种硬件设备SDK的应用开发者。 使用场景及目标:适用于需要高效集成多种硬件设备SDK的项目,特别是那些涉及身份验证、车辆管理、物流仓储等领域的企业级应用。通过使用这些封装好的API,可以大大缩短开发周期,降低维护成本,提高系统的稳定性和易用性。 其他说明:虽然封装后的API极大地简化了开发流程,但对于一些特殊的业务需求,仍然可能需要深入研究底层SDK。此外,在实际部署过程中,还需考虑网络环境、硬件兼容性等因素的影响。
recommend-type

基于STM32F1的BLDC无刷直流电机与PMSM永磁同步电机源码解析:传感器与无传感器驱动详解

基于STM32F1的BLDC无刷直流电机和PMSM永磁同步电机的驱动实现方法,涵盖了有传感器和无传感两种驱动方式。对于BLDC电机,有传感器部分采用霍尔传感器进行六步换相,无传感部分则利用反电动势过零点检测实现换相。对于PMSM电机,有传感器部分包括霍尔传感器和编码器的方式,无传感部分则采用了滑模观测器进行矢量控制(FOC)。文中不仅提供了详细的代码片段,还分享了许多调试经验和技巧。 适合人群:具有一定嵌入式系统和电机控制基础知识的研发人员和技术爱好者。 使用场景及目标:适用于需要深入了解和实现BLDC和PMSM电机驱动的开发者,帮助他们掌握不同传感器条件下的电机控制技术和优化方法。 其他说明:文章强调了实际调试过程中可能遇到的问题及其解决方案,如霍尔传感器的中断触发换相、反电动势过零点检测的采样时机、滑模观测器的参数调整以及编码器的ABZ解码等。
recommend-type

基于Java的跨平台图像处理软件ImageJ:多功能图像编辑与分析工具

内容概要:本文介绍了基于Java的图像处理软件ImageJ,详细阐述了它的跨平台特性、多线程处理能力及其丰富的图像处理功能。ImageJ由美国国立卫生研究院开发,能够在多种操作系统上运行,包括Windows、Mac OS、Linux等。它支持多种图像格式,如TIFF、PNG、GIF、JPEG、BMP、DICOM、FITS等,并提供图像栈功能,允许多个图像在同一窗口中进行并行处理。此外,ImageJ还提供了诸如缩放、旋转、扭曲、平滑处理等基本操作,以及区域和像素统计、间距、角度计算等高级功能。这些特性使ImageJ成为科研、医学、生物等多个领域的理想选择。 适合人群:需要进行图像处理的专业人士,如科研人员、医生、生物学家,以及对图像处理感兴趣的普通用户。 使用场景及目标:适用于需要高效处理大量图像数据的场合,特别是在科研、医学、生物学等领域。用户可以通过ImageJ进行图像的编辑、分析、处理和保存,提高工作效率。 其他说明:ImageJ不仅功能强大,而且操作简单,用户无需安装额外的运行环境即可直接使用。其基于Java的开发方式确保了不同操作系统之间的兼容性和一致性。
recommend-type

MATLAB语音识别系统:基于GUI的数字0-9识别及深度学习模型应用 · GUI v1.2

内容概要:本文介绍了一款基于MATLAB的语音识别系统,主要功能是识别数字0到9。该系统采用图形用户界面(GUI),方便用户操作,并配有详尽的代码注释和开发报告。文中详细描述了系统的各个组成部分,包括音频采集、信号处理、特征提取、模型训练和预测等关键环节。此外,还讨论了MATLAB在此项目中的优势及其面临的挑战,如提高识别率和处理背景噪音等问题。最后,通过对各模块的工作原理和技术细节的总结,为未来的研究和发展提供了宝贵的参考资料。 适合人群:对语音识别技术和MATLAB感兴趣的初学者、学生或研究人员。 使用场景及目标:适用于希望深入了解语音识别技术原理的人群,特别是希望通过实际案例掌握MATLAB编程技巧的学习者。目标是在实践中学习如何构建简单的语音识别应用程序。 其他说明:该程序需要MATLAB 2019b及以上版本才能正常运行,建议使用者确保软件环境符合要求。
recommend-type

c语言通讯录管理系统源码.zip

C语言项目源码
recommend-type

Teleport Pro教程:轻松复制网站内容

标题中提到的“复制别人网站的软件”指向的是一种能够下载整个网站或者网站的特定部分,然后在本地或者另一个服务器上重建该网站的技术或工具。这类软件通常被称作网站克隆工具或者网站镜像工具。 描述中提到了一个具体的教程网址,并提到了“天天给力信誉店”,这可能意味着有相关的教程或资源可以在这个网店中获取。但是这里并没有提供实际的教程内容,仅给出了网店的链接。需要注意的是,根据互联网法律法规,复制他人网站内容并用于自己的商业目的可能构成侵权,因此在此类工具的使用中需要谨慎,并确保遵守相关法律法规。 标签“复制 别人 网站 软件”明确指出了这个工具的主要功能,即复制他人网站的软件。 文件名称列表中列出了“Teleport Pro”,这是一款具体的网站下载工具。Teleport Pro是由Tennyson Maxwell公司开发的网站镜像工具,允许用户下载一个网站的本地副本,包括HTML页面、图片和其他资源文件。用户可以通过指定开始的URL,并设置各种选项来决定下载网站的哪些部分。该工具能够帮助开发者、设计师或内容分析人员在没有互联网连接的情况下对网站进行离线浏览和分析。 从知识点的角度来看,Teleport Pro作为一个网站克隆工具,具备以下功能和知识点: 1. 网站下载:Teleport Pro可以下载整个网站或特定网页。用户可以设定下载的深度,例如仅下载首页及其链接的页面,或者下载所有可访问的页面。 2. 断点续传:如果在下载过程中发生中断,Teleport Pro可以从中断的地方继续下载,无需重新开始。 3. 过滤器设置:用户可以根据特定的规则过滤下载内容,如排除某些文件类型或域名。 4. 网站结构分析:Teleport Pro可以分析网站的链接结构,并允许用户查看网站的结构图。 5. 自定义下载:用户可以自定义下载任务,例如仅下载图片、视频或其他特定类型的文件。 6. 多任务处理:Teleport Pro支持多线程下载,用户可以同时启动多个下载任务来提高效率。 7. 编辑和管理下载内容:Teleport Pro具备编辑网站镜像的能力,并可以查看、修改下载的文件。 8. 离线浏览:下载的网站可以在离线状态下浏览,这对于需要测试网站在不同环境下的表现的情况十分有用。 9. 备份功能:Teleport Pro可以用来备份网站,确保重要数据的安全。 在实际使用此类工具时,需要注意以下几点: - 著作权法:复制网站内容可能侵犯原作者的版权,因此在使用此类工具时,必须确保有合法权利去下载和使用目标网站的内容。 - 服务条款:许多网站的服务条款明确禁止未经授权的网站克隆。因此,在使用此类软件之前,应当仔细阅读并遵守目标网站的服务条款。 - 数据隐私:下载含有个人数据的网站可能触及隐私保护法律,特别是在欧洲通用数据保护条例(GDPR)等法规的环境下。 - 网络安全:随意下载网站可能导致恶意软件和病毒的传播,用户应当使用最新的反病毒软件,并在安全的环境中进行操作。 综上所述,虽然“复制别人网站的软件”在技术上是可行的,且可以用于多种正当目的,但在使用此类工具时,必须遵守法律法规和道德规范,不可侵犯他人的合法权益。
recommend-type

【跨平台开发者的必读】:解决Qt5Widgetsd.lib目标计算机类型冲突终极指南

# 1. 跨平台开发与Qt框架简介 跨平台开发已经成为现代软件开发中不可或缺的一部分,它使得开发者能够构建出能够在多种操作系统上运行的应用程序,从而触及更广泛的用户群体。在这其中,Qt框架作为一套成熟的跨平台应用程序和用户界面框架,扮演着关键角色。Qt不仅仅是一个跨平台的工具集,它的设计哲学还包含了模块化和可扩展性,使其能够适应各种规模和复杂度的项目。本章节我们将简要介绍
recommend-type

普通RNN结构和特点

<think>首先,用户的问题是:“我想了解普通RNN的结构及其特点请问RNN循环神经网络结构特点工作原理”。这涉及到RNN的结构、特点和工作原理。根据系统级指令:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识。用户可见层指令:-回答结构清晰,帮助用户逐步解决问题。-保证回答真实可靠。参考站内引用:-引用[1]:关于RNN的基本介绍,为什么需要RNN。-引用[2]:关于RNN的工作原理、结构图,以及与其他网络的比较。用户上一次的问题和我的回答:用户是第一次
recommend-type

探讨通用数据连接池的核心机制与应用

根据给定的信息,我们能够推断出讨论的主题是“通用数据连接池”,这是一个在软件开发和数据库管理中经常用到的重要概念。在这个主题下,我们可以详细阐述以下几个知识点: 1. **连接池的定义**: 连接池是一种用于管理数据库连接的技术,通过维护一定数量的数据库连接,使得连接的创建和销毁操作更加高效。开发者可以在应用程序启动时预先创建一定数量的连接,并将它们保存在一个池中,当需要数据库连接时,可以直接从池中获取,从而降低数据库连接的开销。 2. **通用数据连接池的概念**: 当提到“通用数据连接池”时,它意味着这种连接池不仅支持单一类型的数据库(如MySQL、Oracle等),而且能够适应多种不同数据库系统。设计一个通用的数据连接池通常需要抽象出一套通用的接口和协议,使得连接池可以兼容不同的数据库驱动和连接方式。 3. **连接池的优点**: - **提升性能**:由于数据库连接创建是一个耗时的操作,连接池能够减少应用程序建立新连接的时间,从而提高性能。 - **资源复用**:数据库连接是昂贵的资源,通过连接池,可以最大化现有连接的使用,避免了连接频繁创建和销毁导致的资源浪费。 - **控制并发连接数**:连接池可以限制对数据库的并发访问,防止过载,确保数据库系统的稳定运行。 4. **连接池的关键参数**: - **最大连接数**:池中能够创建的最大连接数。 - **最小空闲连接数**:池中保持的最小空闲连接数,以应对突发的连接请求。 - **连接超时时间**:连接在池中保持空闲的最大时间。 - **事务处理**:连接池需要能够管理不同事务的上下文,保证事务的正确执行。 5. **实现通用数据连接池的挑战**: 实现一个通用的连接池需要考虑到不同数据库的连接协议和操作差异。例如,不同的数据库可能有不同的SQL方言、认证机制、连接属性设置等。因此,通用连接池需要能够提供足够的灵活性,允许用户配置特定数据库的参数。 6. **数据连接池的应用场景**: - **Web应用**:在Web应用中,为了处理大量的用户请求,数据库连接池可以保证数据库连接的快速复用。 - **批处理应用**:在需要大量读写数据库的批处理作业中,连接池有助于提高整体作业的效率。 - **微服务架构**:在微服务架构中,每个服务可能都需要与数据库进行交互,通用连接池能够帮助简化服务的数据库连接管理。 7. **常见的通用数据连接池技术**: - **Apache DBCP**:Apache的一个Java数据库连接池库。 - **C3P0**:一个提供数据库连接池和控制工具的开源Java框架。 - **HikariCP**:目前性能最好的开源Java数据库连接池之一。 - **BoneCP**:一个高性能的开源Java数据库连接池。 - **Druid**:阿里巴巴开源的一个数据库连接池,提供了对性能监控的高级特性。 8. **连接池的管理与监控**: 为了保证连接池的稳定运行,开发者需要对连接池的状态进行监控,并对其进行适当的管理。监控指标可能包括当前活动的连接数、空闲的连接数、等待获取连接的请求队列长度等。一些连接池提供了监控工具或与监控系统集成的能力。 9. **连接池的配置和优化**: 连接池的性能与连接池的配置密切相关。需要根据实际的应用负载和数据库性能来调整连接池的参数。例如,在高并发的场景下,可能需要增加连接池中连接的数量。另外,适当的线程池策略也可以帮助连接池更好地服务于多线程环境。 10. **连接池的应用案例**: 一个典型的案例是电商平台在大型促销活动期间,用户访问量激增,此时通用数据连接池能够保证数据库操作的快速响应,减少因数据库连接问题导致的系统瓶颈。 总结来说,通用数据连接池是现代软件架构中的重要组件,它通过提供高效的数据库连接管理,增强了软件系统的性能和稳定性。了解和掌握连接池的原理及实践,对于任何涉及数据库交互的应用开发都至关重要。在实现和应用连接池时,需要关注其设计的通用性、配置的合理性以及管理的有效性,确保在不同的应用场景下都能发挥出最大的效能。
recommend-type

【LabVIEW网络通讯终极指南】:7个技巧提升UDP性能和安全性

# 摘要 本文系统介绍了LabVIEW在网络通讯中的应用,尤其是针对UDP协议的研究与优化。首先,阐述了UDP的原理、特点及其在LabVIEW中的基础应用。随后,本文深入探讨了通过调整数据包大小、实现并发通信及优化缓冲区管理等技巧来优化UDP性能的LabVIEW方法。接着,文章聚焦于提升UDP通信安全性,介绍了加密技术和认证授权机制在LabVIEW中的实现,以及防御网络攻击的策略。最后,通过具体案例展示了LabVIEW在实时数据采集和远程控制系统中的高级应用,并展望了LabVIEW与UDP通讯技术的未来发展趋势及新兴技术的影响。 # 关键字 LabVIEW;UDP网络通讯;性能优化;安全性;