当前位置: 首页 > news >正文

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

00. 目录

文章目录

    • 00. 目录
    • 01. 串口简介
    • 02. 串口收发HEX数据包接线图
    • 03. 串口收发HEX数据包示例1
    • 04. 串口收发HEX数据包示例2
    • 05. 串口收发文本数据包接线图
    • 06. 串口收发文本数据包示例
    • 07. 程序示例下载
    • 08. 附录

01. 串口简介

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。 对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性, 确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

02. 串口收发HEX数据包接线图

在这里插入图片描述

03. 串口收发HEX数据包示例1

uart.h

#ifndef __UART_H__
#define __UART_H__#include "stm32f10x.h"    extern uint8_t recvPacket[];void uart_init(void);void uart_send_byte(uint8_t byte);void uart_send_array(uint8_t *arr, uint16_t len);void uart_send_string(char *str);void uart_send_number(uint32_t num, uint8_t len);void uart_printf(char *format, ...);uint8_t uart_getRxFlag(void);uint8_t uart_getRxData(void);void uart_send_packet(uint8_t arr[], int len);#endif /**/

uart.c

#include "uart.h"#include <stdio.h>
#include <stdarg.h>uint8_t recvData;
uint8_t recvFlag;uint8_t recvPacket[32];void uart_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO初始化  PA9 TXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIO初始化  PA10 RXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);USART_InitStruct.USART_BaudRate = 9600;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStruct);//设置串口中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//设置中断分组NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);USART_Cmd(USART1, ENABLE);
}void uart_send_byte(uint8_t byte)
{USART_SendData(USART1, byte);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}void uart_send_array(uint8_t *arr, uint16_t len)
{uint16_t i;for (i = 0; i < len; i++){uart_send_byte(arr[i]);}
}void uart_send_string(char *str)
{uint16_t i = 0;while(*(str + i) != '\0'){uart_send_byte(str[i]);i++;}
}//x的y次方
uint32_t uart_pow(uint32_t x, uint32_t y)
{uint32_t result = 1;while(y){result *= x;y--;}return result;
}void uart_send_number(uint32_t num, uint8_t len)
{uint8_t i;for (i = 0; i < len; i++){uart_send_byte(num / uart_pow(10, len - i - 1) % 10 + '0');}}int fputc(int ch, FILE *fp)
{uart_send_byte(ch);return ch;
}void uart_printf(char *format, ...)
{char str[128];va_list arg;va_start(arg, format);vsprintf(str, format, arg);va_end(arg);uart_send_string(str);
}void USART1_IRQHandler(void)
{static uint8_t recvState = 0;static uint8_t i = 0;if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){recvData = USART_ReceiveData(USART1);//状态机if (0 == recvState){if (recvData == 0xFF){recvState = 1;i = 0;}}else if (1 == recvState){recvPacket[i] = recvData;i++;if (i >= 4){recvState = 2;}} else if (2 == recvState){if (recvData == 0xFE){i = 0;recvState = 0;recvFlag = 1;}}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}}uint8_t uart_getRxFlag(void)
{if (1 == recvFlag){recvFlag = 0;return 1;}return 0;
}uint8_t uart_getRxData(void)
{return recvData;
}//发送HEX报文数据
void uart_send_packet(uint8_t arr[], int len)
{//发送报文 FFuart_send_byte(0xFF);uart_send_array(arr, len);//发送报尾uart_send_byte(0xFE);	
}

main.c

#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "oled.h"
#include "uart.h"int main(void){	 uint8_t arr[] = {0x1, 0x2, 0x3, 0x4};OLED_Init();uart_init();//中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);OLED_ShowChar(1, 1, 'A');uart_send_packet(arr, 4);while(1){if (1 == uart_getRxData()){OLED_ShowHexNum(1, 1, recvPacket[0], 2);OLED_ShowHexNum(1, 4, recvPacket[1], 2);OLED_ShowHexNum(1, 7, recvPacket[2], 2);OLED_ShowHexNum(1, 10, recvPacket[3], 2);			 }	 }return 0;}

04. 串口收发HEX数据包示例2

uart.h

#ifndef __UART_H__
#define __UART_H__#include "stm32f10x.h"    extern uint8_t recvPacket[];void uart_init(void);void uart_send_byte(uint8_t byte);void uart_send_array(uint8_t *arr, uint16_t len);void uart_send_string(char *str);void uart_send_number(uint32_t num, uint8_t len);void uart_printf(char *format, ...);uint8_t uart_getRxFlag(void);uint8_t uart_getRxData(void);void uart_send_packet(uint8_t arr[], int len);#endif /**/

uart.c

#include "uart.h"#include <stdio.h>
#include <stdarg.h>uint8_t recvData;
uint8_t recvFlag;uint8_t recvPacket[32];void uart_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO初始化  PA9 TXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIO初始化  PA10 RXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);USART_InitStruct.USART_BaudRate = 9600;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStruct);//设置串口中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//设置中断分组NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);USART_Cmd(USART1, ENABLE);
}void uart_send_byte(uint8_t byte)
{USART_SendData(USART1, byte);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}void uart_send_array(uint8_t *arr, uint16_t len)
{uint16_t i;for (i = 0; i < len; i++){uart_send_byte(arr[i]);}
}void uart_send_string(char *str)
{uint16_t i = 0;while(*(str + i) != '\0'){uart_send_byte(str[i]);i++;}
}//x的y次方
uint32_t uart_pow(uint32_t x, uint32_t y)
{uint32_t result = 1;while(y){result *= x;y--;}return result;
}void uart_send_number(uint32_t num, uint8_t len)
{uint8_t i;for (i = 0; i < len; i++){uart_send_byte(num / uart_pow(10, len - i - 1) % 10 + '0');}}int fputc(int ch, FILE *fp)
{uart_send_byte(ch);return ch;
}void uart_printf(char *format, ...)
{char str[128];va_list arg;va_start(arg, format);vsprintf(str, format, arg);va_end(arg);uart_send_string(str);
}void USART1_IRQHandler(void)
{static uint8_t recvState = 0;static uint8_t i = 0;if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){uint8_t recvData1 = USART_ReceiveData(USART1);//状态机if (0 == recvState){if (recvData1 == 0xFF){recvState = 1;i = 0;}}else if (1 == recvState){recvPacket[i] = recvData1;i++;if (i >= 4){recvState = 2;}} else if (2 == recvState){if (recvData1 == 0xFE){recvState = 0;recvFlag = 1;}}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}uint8_t uart_getRxFlag(void)
{if (1 == recvFlag){recvFlag = 0;return 1;}return 0;
}uint8_t uart_getRxData(void)
{return recvData;
}//发送HEX报文数据
void uart_send_packet(uint8_t arr[], int len)
{//发送报文 FFuart_send_byte(0xFF);uart_send_array(arr, len);//发送报尾uart_send_byte(0xFE);	
}

main.c

#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "oled.h"
#include "uart.h"
#include "key.h"int main(void){	 uint8_t arr[] = {0x1, 0x2, 0x3, 0x4};//中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);key_init();uart_init();OLED_Init();OLED_ShowString(1, 1, "TxPacket");OLED_ShowString(3, 1, "RxPacket");while(1){if (1 == key_scan()){arr[0]++;arr[1]++; arr[2]++;arr[3]++;uart_send_packet(arr, 4); OLED_ShowHexNum(2, 1, arr[0], 2);OLED_ShowHexNum(2, 4, arr[1], 2);OLED_ShowHexNum(2, 7, arr[2], 2);OLED_ShowHexNum(2, 10, arr[3], 2);			 } if (1 == uart_getRxData()){OLED_ShowHexNum(4, 1, recvPacket[0], 2);OLED_ShowHexNum(4, 4, recvPacket[1], 2);OLED_ShowHexNum(4, 7, recvPacket[2], 2);OLED_ShowHexNum(4, 10, recvPacket[3], 2);			 }	 }return 0;}

05. 串口收发文本数据包接线图

在这里插入图片描述

06. 串口收发文本数据包示例

uart.h

#ifndef __SERIAL_H
#define __SERIAL_H#include <stdio.h>extern uint8_t Serial_TxPacket[];
extern uint8_t Serial_RxPacket[];
extern uint8_t Serial_RxFlag;void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);void Serial_SendPacket(void);#endif

uart.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>uint8_t Serial_TxPacket[4];				//FF 01 02 03 04 FE
char Serial_RxPacket[100];
uint8_t Serial_RxFlag;void Serial_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1, ENABLE);
}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Array[i]);}
}void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++){Serial_SendByte(String[i]);}
}uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y --){Result *= X;}return Result;
}void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');}
}int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}void Serial_Printf(char *format, ...)
{char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String);
}void Serial_SendPacket(void)
{Serial_SendByte(0xFF);Serial_SendArray(Serial_TxPacket, 4);Serial_SendByte(0xFE);
}void USART1_IRQHandler(void)
{static uint8_t RxState = 0;static uint8_t pRxPacket = 0;if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){uint8_t RxData = USART_ReceiveData(USART1);if (RxState == 0){if (RxData == '@' && 0 == Serial_RxFlag){RxState = 1;pRxPacket = 0;}}else if (RxState == 1){if (RxData == '\r'){RxState = 2;}else{Serial_RxPacket[pRxPacket] = RxData;pRxPacket ++;}}else if (RxState == 2){if (RxData == '\n'){RxState = 0;Serial_RxPacket[pRxPacket] = '\0';Serial_RxFlag = 1;}}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"#include <string.h>int main(void)
{OLED_Init();LED_Init();Serial_Init();OLED_ShowString(1, 1, "TxPacket");OLED_ShowString(3, 1, "RxPacket");while (1){if (Serial_RxFlag == 1){OLED_ShowString(4, 1, "                     ");OLED_ShowString(4, 1, Serial_RxPacket);if (strcmp(Serial_RxPacket, "LED_ON") == 0){LED1_ON();OLED_ShowString(2, 1, "                     ");OLED_ShowString(2, 1, "LED_ON_OK");Serial_SendString("LED_ON_OK\r\n");}else if (strcmp(Serial_RxPacket, "LED_OFF") == 0){LED1_OFF();OLED_ShowString(2, 1, "                     ");OLED_ShowString(2, 1, "LED_OFF_OK");	Serial_SendString("LED_OFF_OK\r\n");				}else{OLED_ShowString(2, 1, "                     ");OLED_ShowString(2, 1, "ERROR_COMMAND");	Serial_SendString("ERROR_COMMAND\r\n");				}Serial_RxFlag = 0;}}
}

07. 程序示例下载

24-UART收发HEX数据包

25-UART收发HEX数据包2.rar

26-UART收发文本数据包.rar

08. 附录

参考: 【STM32】江科大STM32学习笔记汇总

相关文章:

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…...

uniapp列表实现方式 v-for

创建列表视图 v-for v-for“对象item in 数组” v-for“(对象item&#xff0c;下标) in 数组” v-for“(对象item&#xff0c;使用这个键取到的值&#xff0c;下标) in 数组” :key 绑定标识 一般建议使用对象中的id等值 类型 any <template><view><view clas…...

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理&#xff0c;schema描述等功能&#xff0c;ORM构筑于其上。本章介绍创建 Engine对象&#xff0c;使用基本的…...

PDF有编辑密码怎么办

目录 注意&#xff1a; windows方法&#xff1a; 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法&#xff1a; 注意&#xff1a; 此方法可以用于破解PDF的编辑密码&#xff0c;而不是PDF的打开密码 当遇到类似如下问…...

智慧公厕:打造智慧城市公共厕所信息化管理的新升级

在现代社会中&#xff0c;随着科学技术的不断进步与应用&#xff0c;智慧公厕作为公共服务设施&#xff0c;正迎来一次新的升级与革新。利用先进技术&#xff0c;智慧公厕实现了信息化升级&#xff0c;能够实时监测人员、环境和设备状况&#xff0c;提高使用效率、安全性、舒适…...

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景&#xff1a; 总部采集分支的数据&#xff0c;由于分支的 id 是子增的主键 id&#xff0c;所以会出现重复的 id&#xff0c;但是这个 id 需要作为标识&#xff0c;没有实际作用&#xff0c;这里选择的是分布式 id 雪花算法生成 id 存储用来标识&#xff0c;这…...

文心一言 vs. ChatGPT:哪个更胜一筹?

文心一言 vs. ChatGPT&#xff1a;从简洁美到深度思考的文本生成之旅 近年来&#xff0c;文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中&#xff0c;文心一言和ChatGPT作为两个备受瞩目的工具&#xff0c;各自以独特的优势展现在用户面前。本文将…...

LoadBalancer 替换 Ribbon

POM 移除 Ribbon 相关依赖 <!-- LoadBalancer 必须引入 springcloud --> <!-- 父pom引入springcloud 版本管理 --> https://spring.io/projects/spring-cloud/ 官网查看 boot 对应的 cloud 的版本 <dependencyManagement><dependency> <groupI…...

Jsqlparser简单学习

文章目录 学习链接模块访问者模式parser模块statement模块Expression模块deparser模块 测试TestDropTestSelectTestSelectVisitor 学习链接 java设计模式&#xff1a;访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse&#xff08;一&#xff09;基本增删改…...

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./boot) 指定脚本执行路…...

Qt单个字符判断

1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…...

通过OpenIddict设计一个授权服务器02-创建asp.net项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…...

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…...

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…...

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具&#xff0c;主要用于游戏艺术创作。它提供了一套全面的功能&#xff0c;旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力&#xff0c;允许用户根据独特的风格和艺术方向训…...

ChatGPT和文心一言哪个好用?

#ChatGPT 和文心一言哪个更好用&#xff1f;# 在当今信息爆炸的时代&#xff0c;人们对于文本生成和创作工具的需求越来越高。在这个背景下&#xff0c;ChatGPT和文心一言作为备受瞩目的工具&#xff0c;各自拥有独特的功能和用途。在本文中&#xff0c;我们将深入探讨这两个工…...

纯c++简易的迷宫小游戏

一个用c写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 总体思路 初始化游戏界面&#xff1a;设置迷宫的大小&#xff08;WIDTH和HEIGH&#xff09;&#xff0c;生成迷宫地图&#xff08;map&#xff09;&#xff0c;包括墙壁、空地、起点和终点。显示…...

基于python舆情分析可视化系统+情感分析+爬虫+机器学习(源码)✅

大数据毕业设计&#xff1a;Python招聘数据采集分析可视化系统✅ 毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&…...

2024年1月16日Arxiv热门NLP大模型论文:Multi-Candidate Speculative Decoding

大幅提速NLP任务&#xff0c;无需牺牲准确性&#xff01;南京大学提出新算法&#xff0c;大幅提升AI文本生成效率飞跃 引言&#xff1a;探索大型语言模型的高效文本生成 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;大型语言模型&#xff08;LLMs&#xf…...

AI对决:ChatGPT与文心一言的比较

文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文心一言的优势AI技术发展趋势总结 引言 在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...