二维码扫码模组国产麒麟系统C语言SDK二次开发

news2024/11/23 3:10:57

在国产系统麒麟V10系统上面上使用的 USB HID POS 的 SDK 包.

特别说明涉及到永久参数的函数接口,请勿频繁使用.如果是出厂或者偶尔设置推荐使用永久参数,如果是每次读码都进行参数修改,请使用临时参数.频繁进行永久参数操作会减小扫码设备的使用寿命.

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

#include "tx_scanner.h"

/*************************************************************************
内部宏定义
*************************************************************************/


/*************************************************************************
内部结构、枚举、公用体等结构声明
*************************************************************************/

/*************************************************************************
内部静态变量定义

全局变量定义

extern 外部变量声明

*************************************************************************/


/*************************************************************************
静态函数声明

extern 外部函数声明
*************************************************************************/
/**解码数据回调函数**/
static int32 tx_scanner_sdk_decode_data_cb(uint8 ucCodeType, uint8 *pBuf, uint32 uiBufLen);

/**连接状态回调函数**/
static void tx_scanner_sdk_comm_state_cb_fun(uint8 ucState);
static void tx_scanner_sdk_show_menu(void);
/*************************************************************************
函数定义
*************************************************************************/
int32 main(void)
{
	int32 iRet;
	uint8 ucVer[64] = "";
	uint8 ucTemp1;
	uint8 ucTemp2;
	uint8 ucTemp3[50];
	int length = 0;

	tx_scanner_get_version(ucVer, sizeof(ucVer));
	printf("linux c/c++ usb hidpos demo ver:%s\r\n", ucVer);

	/**注册解码数据回调函数**/
	iRet = tx_scanner_decode_data_fun_register(tx_scanner_sdk_decode_data_cb);
	if(iRet < 0)
	{
		printf("tx_scanner_decode_data_fun_register fail!!!\r\n");
		return 1;
	}

	/**注册设备连接状态回调函数**/
	iRet = tx_scanner_comm_state_fun_register(tx_scanner_sdk_comm_state_cb_fun);
	if(iRet < 0)
	{
		printf("tx_scanner_comm_state_fun_register fail!!!\r\n");
		return 1;
	}

	/**初始化**/
	iRet = tx_scanner_init();
	if(iRet < 0)
	{
		printf("tx_scanner_init fail!!!\r\n");
		return 1;
	}

	printf("******************************************************\r\n");
	printf("a:start decode\r\n");
	printf("b:stop decode\r\n");
	printf("c:no time decode start\r\n");
	printf("d:get version info\r\n");
	printf("e:get product info\r\n");
	printf("f:set trigger mode; 0:LEVEL,1:PULSE,2:CONTINUOUS,3:AUTOSENS; save:0:no,1:yes.(eg:f01)\r\n");
	printf("g:get trigger mode\r\n");
	printf("h:set light LED; 0:working light,1:always off,2:always on; save:0:no,1:yes.(eg:h01)\r\n");
	printf("i:get light LED\r\n");
	printf("?/m:more menu\r\n");
	printf("q:quit\r\n");
	printf("******************************************************\r\n");

	while(1)
	{
		switch(getchar())
		{
			case 'a':
			case 'A':
				iRet = tx_scanner_decode_start();
				if(iRet < 0)
					printf("tx_scanner_decode_start fail!!!\r\n");
				else
					printf("start\r\n");
				break;

			case 'b':
			case 'B':
				iRet = tx_scanner_decode_stop();
				if(iRet < 0)
					printf("tx_scanner_decode_stop fail!!!\r\n");
				else
					printf("stop\r\n");
				break;

			case 'c':
			case 'C':
				iRet = tx_scanner_no_time_decode_start();
				if(iRet < 0)
					printf("tx_scanner_no_time_decode_start fail!!!\r\n");
				else
					printf("no time start\r\n");
				break;

			case 'd':
			case 'D':
				{
					uint8 ucVerInfo[128] = "";
				
					iRet = tx_scanner_get_version_info(ucVerInfo, sizeof(ucVerInfo));
					if(iRet < 0)
						printf("tx_scanner_get_version_info fail!!!\r\n");
					else
						printf("%s\r\n", ucVerInfo);
				}
				break;

			case 'e':
			case 'E':
				{
					uint8 ucProInfo[128] = "";
				
					iRet = tx_scanner_get_all_product_info(ucProInfo, sizeof(ucProInfo));
					if(iRet < 0)
						printf("tx_scanner_get_all_product_info fail!!!\r\n");
					else
						printf("%s\r\n", ucProInfo);
				}
				break;

			case 'f':
			case 'F':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_trigger_mode((DB_TRIGGER_MODE_E)ucTemp1, ucTemp2);
				if(iRet < 0)
					printf("tx_scanner_set_trigger_mode fail!!!\r\n");
				break;

			case 'g':
			case 'G':
				iRet = tx_scanner_get_trigger_mode();
				printf("tx_scanner_get_trigger_mode:%d\r\n", iRet);
				break;		

			case 'h':
			case 'H':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_light_state((DB_LED_STATE_E)ucTemp1, ucTemp2);
				if(iRet < 0)
					printf("tx_scanner_set_light_state fail!!!\r\n");
				break;

			case 'i':
			case 'I':
				iRet = tx_scanner_get_light_state();
				printf("tx_scanner_get_light_state:%d\r\n", iRet);
				break;	
				
			case 'j':
			case 'J':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_focus_state((DB_LED_STATE_E)ucTemp1, ucTemp2);
				if (iRet < 0)
					printf("tx_scanner_set_focus_state fail!!!\r\n");
				break;

			case 'k':
			case 'K':
				iRet = tx_scanner_get_focus_state();
				printf("tx_scanner_set_focus_state:%d\r\n", iRet);
				break;
			
			case 'l':
			case 'L':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_en_prefix(ucTemp1, ucTemp2);
				if (iRet < 0)
					printf("tx_scanner_set_prefix_function fail!!!\r\n");
				break;

			case 'n':
			case 'N':
				iRet = tx_scanner_get_en_prefix();
				printf("tx_scanner_get_prefix_function_state:%d\r\n", iRet);
				break;

			case 'o':
			case 'O':
				{
					uint8 ucPrefix[] = "ABC";

					ucTemp1 = getchar();
					ucTemp1 -= '0';

					length = strlen((char*)ucPrefix);
					iRet = tx_scanner_set_prefix(ucPrefix, length, ucTemp1);
					if(iRet < 0)
					{
						printf("tx_scanner_set_prefix fail!!!\r\n");
					}
					break;
				}
				
			case 'p':
			case 'P':
				memset(ucTemp3,0,sizeof(ucTemp3));
				iRet = tx_scanner_get_prefix(ucTemp3, length);
				printf("tx_scanner_get_prefix_length:%d\r\n",iRet);
				break;
			
			case 'r':
			case 'R':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_en_suffix(ucTemp1, ucTemp2);
				if (iRet < 0)
					printf("tx_scanner_set_suffix_function fail!!!\r\n");
				break;
				
			case 's':
			case 'S':
				iRet = tx_scanner_get_en_suffix();
				printf("tx_scanner_get_suffix_function_state:%d\r\n", iRet);
				break;
				
			case 't':
			case 'T':
				{
					uint8 ucSuffix[] = "CBA";

					ucTemp1 = getchar();
					ucTemp1 -= '0';

					length = strlen((char*)ucSuffix);
					iRet = tx_scanner_set_suffix(ucSuffix, length, ucTemp1);
					if(iRet < 0)
					{
						printf("tx_scanner_set_suffix fail!!!\r\n");
					}
					break;
				}

			case 'u':
			case 'U':
				memset(ucTemp3,0,sizeof(ucTemp3));
				iRet = tx_scanner_get_suffix(ucTemp3,length);
				printf("tx_scanner_get_suffix_length:%d\r\n",iRet);
				break;
			
			case 'v':
			case 'V':
				{
					uint16 ucTime;
					printf("Please enter the duration of a single scan(0-65536)\r\n");
					scanf("%hd\r\n",&ucTime);
					ucTemp2 = getchar();

					ucTemp2 -= '0';
					printf("%d,%d\r\n",ucTime,ucTemp2);
					iRet = tx_scanner_set_once_scan_time(ucTime,ucTemp2);
					if(iRet < 0)
					{
						printf("tx_scanner_set_once_scan_time fail!!!\r\n");
					}
					break;
				}
			
			case 'w':
			case 'W':
				iRet = tx_scanner_get_once_scan_time();
				printf("tx_scanner_get_once_scan_time:%d\r\n", iRet);
				break;

			case 'x':
			case 'X':
				printf("Please enter the volume level of the prompt tone(0-100):\r\n");
				scanf("%hhd\r\n",&ucTemp1);
				ucTemp2 = getchar();

				ucTemp2 -= '0';
				printf("%d,%d\r\n",ucTemp1,ucTemp2);
				iRet = tx_scanner_set_beep_volume(ucTemp1,ucTemp2);
				if(iRet < 0)
				{
					printf("tx_scanner_set_beep_volume fail!!!\r\n");
				}
				break;

			case 'y':
			case 'Y':
				iRet = tx_scanner_get_beep_volume();
				printf("tx_scanner_get_beep_volume:%d\r\n",iRet);
				break;
				
			case 'z':
			case 'Z':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n", ucTemp1, ucTemp2);
				iRet = tx_scanner_set_heartbeat_type((DB_HEARTBEAT_TYPE_E)ucTemp1, ucTemp2);
				if (iRet < 0)
					printf("tx_scanner_set_heartbeat_type fail!!!\r\n");
				break;
				
			case '0':
				iRet = tx_scanner_get_heartbeat_type();
				printf("tx_scanner_get_heartbreat_type:%d\r\n",iRet);
				break;

			case '1':
				{
					uint32 uiGapTime;
					printf("Please enter the time between heartbeat intervals(0-2147483648):\r\n");
					scanf("%d\r\n",&uiGapTime);
					ucTemp2 = getchar();

					ucTemp2 -= '0';
					printf("%d,%d\r\n",uiGapTime,ucTemp2);
					iRet = tx_scanner_set_heartbeat_gap_time(uiGapTime,ucTemp2);
					if(iRet < 0)
					{
						printf("tx_scanner_set_heartbeat_gap_time faill!!!\r\n");
					}
					break;
				}
				
			case '2':
				iRet = tx_scanner_get_heartbeat_gap_time();
				printf("tx_scanner_get_heartbeat_gap_time:%d\r\n",iRet);
				break;

			case '3':
				{
					uint32 uiAckTime;
					printf("Please enter the time for the heartbeat to wait for a response(0-2147483648):\r\n");
					scanf("%d\r\n",&uiAckTime);
					ucTemp2 = getchar();

					ucTemp2 -= '0';
					printf("%d,%d\r\n",uiAckTime,ucTemp2);
					iRet = tx_scanner_set_heartbeat_wait_ack_time(uiAckTime,ucTemp2);
					if(iRet < 0)
					{
						printf("tx_scanner_set_heartbeat_wait_ack_time faill!!!\r\n");
					}
					break;
				}

			case '4':
				iRet = tx_scanner_get_heartbeat_wait_ack_time();
				printf("tx_scanner_get_heartbeat_wait_ack_time:%d\r\n",iRet);
				break;
				
			case '5':
				iRet = tx_scanner_reset();
				printf("tx_scanner_reset:%d\r\n",iRet);
				break;

			case '6':
				ucTemp1 = getchar();

				ucTemp1 -= '0';
				printf("%d\r\n",ucTemp1);
				iRet = tx_scanner_scan_sw(ucTemp1);
				if(iRet > 0)
				{
					printf("tx_scanner_scan_sw fail!!!\r\n");
				}
				break;

			case '7':
				ucTemp1 = getchar();
				ucTemp2 = getchar();

				ucTemp1 -= '0';
				ucTemp2 -= '0';
				printf("%d,%d\r\n",ucTemp1,ucTemp2);
				iRet = tx_scanner_cmd_setcode_sw(ucTemp1,ucTemp2);
				if(iRet > 0)
				{
					printf("tx_scanner_cmd_setcode_sw fail!!!\r\n");
				}
				break;
				
			case '8':
			{
				uint32 uiBeepType;
				printf("Please enter the beep type(0-20):\r\n");
				scanf("%d",&uiBeepType);

				tx_scanner_play_beep((MP_BEEP_TYPE_E)uiBeepType);
			}
			break;
			
			case 'm':
			case 'M':
			case '?':
				tx_scanner_sdk_show_menu();
				break;
			
			case 'q':
			case 'Q':
				printf("quit\r\n");
				return 0;
				break;

			default:
				break;
		}
	}
	
	return 0;
}

static uint32 s_uiDecodeCnt = 0;
static int32 tx_scanner_sdk_decode_data_cb(uint8 ucCodeType, uint8 *pBuf, uint32 uiBufLen)
{
	printf("[%03d][%02d]len:%d,data:%s\r\n", ++s_uiDecodeCnt, ucCodeType, uiBufLen, pBuf);
}

static void tx_scanner_sdk_comm_state_cb_fun(uint8 ucState)
{
	/**0:断开连接,1:连接**/
	printf("scanner comm state:%d\r\n", ucState);
}

static void tx_scanner_sdk_show_menu(void)
{
	printf("***************************MENU***************************\r\n");
	printf("a:start decode\r\n");
	printf("b:stop decode\r\n");
	printf("c:no time decode start\r\n");
	printf("d:get version info\r\n");
	printf("e:get product info\r\n");
	printf("f:set trigger mode; 0:LEVEL,1:PULSE,2:CONTINUOUS,3:AUTOSENS; save:0:no,1:yes.(eg:f01)\r\n");
	printf("g:get trigger mode\r\n");
	printf("h:set light LED; 0:working light,1:always off,2:always on; save:0:no,1:yes.(eg:h01)\r\n");
	printf("i:get light LED\r\n");
	printf("j:set focus state; 0:working light,1:always off,2:always on; save:0:no,1:yes.(eg:j01)\r\n");
	printf("k:get fucus state\r\n");
	printf("l:set en prefix; 0:OFF,1:ON; save:0:no,1:yes.(eg:l01)\r\n");
	printf("n:get en prefix\r\n");
	printf("o:set prefix; save:0:no,1:yes.(eg:o0)\r\n");
	printf("p:get prefix length\r\n");
	printf("r:set en suffix; 0:OFF,1:ON; save:0:no,1:yes.(eg:r01)\r\n");
	printf("s:get en suffix\r\n");
	printf("t:set suffix; save:0:no,1:yes.(eg:t0)\r\n");
	printf("u:get suffix length\r\n");
	printf("v:set once scan time(0-65536); save:0:no,1:yes.(eg:v01)\r\n");
	printf("w:get once scan time\r\n");
	printf("x:set beep volume(0-100); save:0:no,1:yes.(eg:x01)\r\n");
	printf("y:get beep volume\r\n");
	printf("z:set heartbeat type; 0:BAN,1:NO ACK,2:ACK; save:0:no,1:yes.(eg:z01)\r\n");
	printf("0:get heartbeat type\r\n");
	printf("1:set heartbeat gap time(0-2147483648); save:0:no,1:yes.(eg:101)\r\n");
	printf("2:get heartbeat gap time\r\n");
	printf("3:set heartbeat wait ack time(0-2147483648); save:0:no,1:yes.(eg:301)\r\n");
	printf("4:get heartbeat wait ack time\r\n");
	printf("5:reset\r\n");
	printf("6:set scan sw; 0:unable,1:able\r\n");
	printf("7:set setcode sw; 0:unable,1:able; save:0:no,1:yes.(eg:71)\r\n");
	printf("8:set beep type(0-20)\r\n");
	printf("?/m:more menu\r\n");
	printf("q:quit\r\n");
	printf("******************************************************\r\n");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础国产GD32单片机编程入门(二十五)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F103C8T6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F103C8T6 USB虚拟串口是一种采用GD32F103C8T6单片机&#xff0c;通过U…

android10 系统定制:增加应用使用数据埋点,应用使用时长统计

需求意在统计应用的使用时长和开始结束时间,最终生成一个文件可以直观看出什么时候进入了哪个应用、什么时候退出,如图: 每行记录了应用的进入或退出,以逗号分割。分别记录了事件开始时间,应用包名,进入或退出(1或2),应用名称。 根据上面的数据记录可以看出:2024-08…

B2C电商接口解决方案||搭建电商项目必备电商接口

01 涉及接口 电商接口&#xff1a;天猫、京东商城、拼多多、有赞、快递鸟接口。 02 业务场景 企业在第三方电商平台开店&#xff0c;需要对电商平台上商品价格、库存进行更新&#xff0c;并将电商订单下载到ERP系统&#xff0c;ERP进行作业后&#xff0c;将物流信息上传到电…

【MATLAB源码-第265期】基于simulink的DQPSK调制解调系统仿真,未直接调用模块并且手动实现,输出各节点波形图。

操作环境&#xff1a; MATLAB 2013a / 2013b 1、算法描述 差分正交相移键控&#xff08;DQPSK&#xff09;调制解调系统是一种非常成熟的数字通信技术&#xff0c;主要用于传输数据中的相位变化&#xff0c;而非绝对相位。这一特性使得它对信号中的相位抖动和其他干扰具有更…

再次进阶 舞台王者 第八季完美童模全球赛见证官【孔翊橙】赛场+秀场超燃合集!

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上&#xff0c;一位才能出众的少女——孔翊橙迎来了她舞台生涯的璀璨时刻。见证官——孔翊橙&#xff0c;以璀璨童星之姿&#xff0c;优雅地踏上完美童模盛宴的绚丽舞台&#xff0c;作为开…

双副本与双活:TDengine 为企业打造的高效数据管理利器

在现代数据管理中&#xff0c;企业对于可靠性、可用性和成本的平衡有着多样化的需求。为此&#xff0c;TDengine 在 3.3.0.0 版本中推出了两种不同的企业级解决方案&#xff1a;双活方案和基于仲裁者的双副本方案&#xff0c;以满足不同应用场景下的特殊需求。本文将详细探讨这…

看看智慧门诊银医通自助服务方案,如何化解医院患者跑难题

“看病三分钟&#xff0c;排队三小时”&#xff0c;这是许多患者在就医过程中的无奈吐槽。挂号队伍长如龙&#xff0c;看病流程繁琐复杂&#xff0c;缴费窗口人满为患&#xff0c;检查报告等待时间漫长…… 这些就医痛点&#xff0c;不仅让患者身心疲惫&#xff0c;也给医院的管…

Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

wifi MSDU MPDU BA

MSDU (Mac service data unit) mac 服务层 数据单元&#xff0c; 也就是包含了 mac 层头和 FCS 的 802.11 包。 MPDU&#xff08;Mac protocol data unit&#xff09;mac 协议层数据单元&#xff0c; 这个包只是原始的802.11 数据包 在新的wifi 协议中有两种聚合方式 A-MSDU…

数仓建设:为什么我们的数据容易被业务方质疑?

目录 0 问题背景 1 问题产生的原因 2 问题解决方案 3 小结 数字化建设通关指南专栏原价99&#xff0c;现在活动价39.9&#xff0c;按照阶梯式增长&#xff0c;直到恢复原价 0 问题背景 “ 在数字化建设进程中&#xff0c;无论是处于数据产品的你&#xff0c;或是数据开发的…

ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯

IGT-DSER智能网关模块支持西门子、三菱、欧姆龙、罗克韦尔AB等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需PLC内编程开发&#xff0c;只要在IGT-DSER智…

Python 数学建模——Vikor 多标准决策方法

文章目录 前言原理步骤代码实例 前言 Vikor 归根到底其实属于一种综合评价方法。说到综合评价方法&#xff0c;TOPSIS&#xff08;结合熵权法使用&#xff09;、灰色关联度分析、秩和比法等方法你应该耳熟能详。Vikor 未必比这些方法更出色&#xff0c;但是可以拓展我们的视野。…

从GreaterWMS学习仓库管理系统

前言 客户并不知道&#xff08;确切地&#xff09;他们需要什么&#xff1f; 需要通过需求分析工具和技术&#xff0c;利用宽进严出的需求池&#xff0c;需求验证使用原型测试&#xff0c;场景分析&#xff0c;专家评审&#xff0c;交叉检查等手段&#xff0c;经过充分验证的需…

牛耕分解+形态学分割 全覆盖路径规划(二)Part1. 分割

书接上文&#xff1a;牛耕分解形态学分割 全覆盖路径规划&#xff08;一&#xff09; 前置文章1&#xff1a;房屋区域分割算法 Morphological Segmentation 前置文章2&#xff1a;牛耕覆盖算法 Boustrophedon Coverage Path Planning 项目地址&#xff1a;ipa320 / ipa_cove…

基于Kubernetes部署Spark:spark on kubernetes

什么是spark&#xff1f; spark是一种基于内存的快速、通用、可扩展的的数据分析计算引擎。 Hadoop、Hive、Spark是什么关系&#xff1f; 大数据技术生态中&#xff0c;Hadoop、Hive、Spark是什么关系&#xff1f;| 通俗易懂科普向_哔哩哔哩_bilibili Hadoop 与 HDFS (Hado…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库基本信息数据库配置设置密码控制台开启…

腾讯联合多所高校出品!AI游戏生成模型 GameGen-O 轻松生成高质量游戏元素

最近&#xff0c;香港和中国的几所大学与腾讯联合研发了一个名为 GameGen-O 的 AI 模型&#xff0c;专门用于创建开放世界视频游戏的模拟。 GameGen-O 的功能不仅仅限于生成高质量的游戏内容&#xff0c;它还模拟了多种游戏引擎的特性&#xff0c;能够创造出丰富多样的游戏元素…

字符分类函数和字符串函数

Hello~,欢迎大家来到我的博客进行学习&#xff01; 目录 1.字符分类函数&#x1f618;1.1解释以及使用&#x1f92f;1.2将字符分类函数组合使用&#x1f47b;2 .字符转换函数&#x1f9d0; 1.字符分类函数&#x1f618; 1.1解释以及使用&#x1f92f; 在键盘上敲的字符有许多…

揭秘高效日志管理:解锁数据宝藏,驱动业务精准决策

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

duckdb 连接postgres 和 jdbc 的使用

why&#xff1f; 主要是特别快 嵌入式&#xff0c;不需要服务器&#xff0c;使用超级方便 扩展机制灵活&#xff0c;可以直接读取CSV、JSON、Parquet等文件 Parquet文件格式详解&#xff08;含行、列式存储区别&#xff09;_parquet格式-CSDN博客 采用列式存储&#xff08;用…