- 博客(3106)
- 资源 (44)
- 收藏
- 关注

原创 鸿蒙OS应用开发的开发环境
当你想投入到这个生态系统里的时候,首先是使用它,这是最方便的方法,比如买一台带有鸿蒙系统的手机,并且不断地使用它,提出你自己的建议,让它进行完善和改进。在这里主要开始学习开发鸿蒙系统的应用,由于鸿蒙系统发布的时间不是很久,当然是相对安卓和IOS来说,因此它是一个全新的系统,并且致力于创建一种更方便的软件方式,它引入不同于以往的软件开发语言,以及不同的界面接口。这时候,就可以看到应用的名称,包的名称,保存的位置,编译的SDK版本,运行模式,是否可视化编辑,语言,兼容性API,设备类型。
2023-12-07 12:31:53
765
原创 C#里与嵌入式系统W5500网络通讯(2)
在嵌入式系统中,通过SPI接口访问W5500芯片需要遵循特定的通信协议。首先,硬件上需正确连接SPI线路。通信时,数据格式包括16位地址、控制字节(用于选择寄存器和操作模式)以及数据字节。例如,接收缓冲区的地址可通过宏定义计算得出。读写操作通过函数实现:WIZCHIP_READ用于读取数据,WIZCHIP_WRITE用于写入数据。这些函数通过SPI接口发送地址和控制信息,并根据操作模式选择单字节或批量传输。操作完成后,需释放片选信号以结束通信。
2025-05-18 11:42:40
90
原创 C#里使用Prism.Core的例子
在WPF应用程序开发中,使用Prism.Core框架可以显著加速开发过程。首先,通过安装Prism.Core及其依赖包来配置项目环境。接着,创建应用程序的主窗口文件,定义XAML布局和资源,包括数据模板和转换器,用于处理UI元素的显示逻辑。然后,编写后台代码以处理用户交互,如列表项的选择事件。此外,定义数据模型(Models)和视图模型(ViewModels)来管理应用程序的数据和业务逻辑。视图模型中使用Prism的DelegateCommand来处理命令绑定,实现数据的过滤和选择功能。整个开发流程通过模块
2025-05-16 13:24:21
136
原创 C#里WPF使用触发器实现鼠标点击响应
在WPF中,通过自定义用户控件实现鼠标点击事件响应,可以使用事件触发器。在ListView中,每个TextBlock项通过Interaction.Triggers绑定MouseLeftButtonDown事件,触发InvokeCommandAction执行TextBlockClickCommand命令,并传递当前绑定对象作为参数。在ItemMenu类中,TextBlockClickCommand通过RelayCommand初始化,点击时调用OnTextBlockClick方法处理事件。RelayComman
2025-05-12 11:00:33
237
原创 C#WPF里不能出现滚动条的原因
在WPF中使用mdix:DrawerHost.LeftDrawerContent时,默认的RowDefinition高度设置为auto会导致滚动条无法显示。通过将RowDefinition的高度修改为比例值(如*),可以确保ScrollViewer能够正确显示垂直滚动条。具体修改为<RowDefinition Height="*"/>后,ScrollViewer的VerticalScrollBarVisibility属性生效,滚动条得以显示。这种调整适用于需要动态调整内容高度
2025-05-12 08:49:58
217
原创 C#里与嵌入式系统W5500网络通讯(1)wizchip_sw_reset
wizchip_sw_reset()函数用于实现WIZnet网络芯片(如W5500)的软件复位功能。该函数通过向模式寄存器写入复位命令(MR_RST)触发芯片复位,并在复位前后保存和恢复关键网络配置参数,如MAC地址、网关、子网掩码和IP地址,以确保网络配置不变。代码通过条件编译处理间接总线模式下的特殊需求,确保在不同通信模式下正确访问寄存器。复位后,函数通过读取寄存器实现简易延时,确保芯片完全初始化。该函数适用于系统初始化、网络异常恢复等场景,需注意延时和线程安全问题,且不同型号芯片可能存在细微差异。
2025-05-11 12:40:30
112
原创 C#里创建一个MaterialDesign3的导航条
本文详细介绍了如何创建一个带有左侧导航窗口的WPF应用程序。首先,通过XAML定义了主窗口的结构,包括窗口样式、背景颜色、标题栏内容等。接着,使用DrawerHost控件实现了左侧导航抽屉,并通过ToggleButton控制其展开与收起。在代码部分,通过InitMenu方法初始化了导航菜单,使用自定义控件UserControlMenuItem来显示菜单项及其子项。ItemMenu和SubItem类分别用于管理菜单项和子项的数据。最终,通过绑定和布局,实现了左侧导航窗口的动态显示与交互功能。
2025-05-09 17:16:03
207
原创 C#里创建一个TCP客户端连接类
TCP客户端,一般分为两种,一种是同步收发数据,这种需要开发线程来处理。另外一种,就是使用异步连接,这样只需要一个线程,就可以连接很多个。如果连接比较多,就会消耗比较多线程。C#里创建一个TCP客户端连接类。
2025-04-29 16:37:15
336
原创 C#里嵌入lua脚本的例子
以便发现脚本有什么问题,不能在MCU里去发现问题,否则那样会比较困难调试,或者不适合提示。比如在GD32的MCU里运行lua脚本,又者在ESP32里运行它,都是比较方便的。当脚本要发送给MCU运行之前,我们需要在PC的软件里对脚本进行编译,由于lua脚本比较小,并且适用性很强,非常适合嵌入式系统里加入。所以需要在PC里进行预编译,并且进行语法检查是否合法。这样就需要在C#里引入lua脚本引擎。
2025-04-29 08:55:12
476
原创 C#里使用libxl来创建EXCEL文件然后发送到网络
本例子就说明怎么样创建一个EXCEL文件,也可以直接发送到网络,而不需要保存到文件,直接在内存里高效操作。在这里要使用函数SaveRaw,输入参数是保存数据缓冲区和缓冲区的大小,返回数据和大小。前面一个例子说明了从网络直接读取EXCEL数据的方法,
2025-04-26 12:06:48
149
原创 C#里使用libxl来加载网络传送过来的EXCEL文件
如果文件比较小,就不必要这样做了,可以直接保存在内存,然后使用函数LoadRaw就解决了。是不是把数据先保存到文件,再使用传统的方式打开它呢?从服务器传送过来的数据,是一个EXCEL文件,其实这样做,也是可以的,对于比较大的文件来说。那么怎么样获取里面的数据比较合适呢?这样就可以读取EXCEL数据。
2025-04-26 11:57:00
229
原创 C#里使用MaterialDesign时在VS2022里出错
- 新版 Microsoft.Xaml.Behaviors 的声明 -->这样就可以在VS2022里使用materialdesign了,-- 旧版 Blend SDK 的声明 -->需要修改为最后这个才不会出错。
2025-04-13 11:18:44
147
原创 C#里使用MaterialDesign来构造自定义窗口
它是一个采用MaterialDesign开源库来创建的WPF程序。WPF程序要复杂很多,一个简单的工程,就需要写这么多代码。本例子主要就是创建一个上面的界面,
2025-04-11 15:04:21
171
原创 C#里设计Modbus-RTU(Remote Terminal Unit)协议
广泛用于工业自动化领域,支持主从式(Master-Slave)通信架构。从站地址=01,功能码=03,起始寄存器地址=0x006B(十进制107),寄存器数量=3。从站验证地址和CRC后,执行操作并返回响应帧(成功返回数据,失败返回异常码)。返回6字节数据(3个寄存器的值:0x022B, 0x0000, 0x0064),从站地址=01, 功能码=03, 返回字节数量=06, 后面是3个寄存器值。:1字节(如03=读保持寄存器,06=写单个寄存器)。:1字节(0~247,0为广播地址)。
2025-04-09 15:51:51
161
原创 C#里使用libxl来改变字体的特性
因为打印机基本上都是黑白的颜色,只有字体的大小和黑白才能引起人们的关注。因为不同的字体和大小,就突出对不同内容的关注程度。在做报表的过程中,字体是很关键的信息。
2025-04-05 12:58:16
135
原创 C#里第一个WPF程序
WPF程序对界面进行优化,但是比WINFORMS的程序要复杂很多,并且界面UI基本上不适合拖放,所以需要比较多的时间来布局界面,随着客户对界面的需求提高,还是需要采用这样的方式来实现。产且需要开发人员编写更多的代码。即使如此,在面对诱人的界面表现,App.xaml文件中定义。从这几堆代码来看,就比较多。
2025-04-03 14:08:02
233
原创 C#里使用libxl的对齐/边框/颜色
可以把这里的格式做一个初步的了解,根据实际情况来选择不同的内容显示。以便表示一些重要的信息,这样才能让人们一眼就看到需要关注的信息。一份好的EXCEL文件,通道会有不同的颜色和边框来表示。
2025-03-30 18:08:48
272
原创 C#里实现C#脚本单步执行的信息提示
比如在每一行代码后面添加调试信息代码,这样才能达到我们的目标。如果可以把脚本当作单行执行,并输出信息,那么调试就方便很多。如果一个函数作为一个单位,那么调试的颗粒度有点大,要实现上述的目标,需要对于进行调试的代码进行处理。我们常常需要调试脚本,查看脚本是否运行正确。这样对于写脚本人员来说,显然要求有点高。然后再对这样的代码进行编译和运行。当使用C#语言作为脚本运行时,
2025-03-29 18:25:13
371
原创 C#里使用C#语言作为脚本运行的方法
其实可以使用脚本的方式,因为客户可以随便根据脚本来做数据的调整。面向的客户也越来越多,那么需求也越来越多,在C#里使用C#作为脚本是最简单的方式。还有很多的需求是需要去现场调试的。随着开发的软件越来越复杂,这样就导致需要大量的人力。怎么样才能避免这个问题呢?
2025-03-29 17:22:08
180
原创 C#里使用libxl的数字格式
还有科学计算表示的数字使用小数点位数与普通货币也不一样。比如表示货币数字时,与表示普通序号的数字就不一样。由于EXCEL里可以表示不同的数字格式,
2025-03-22 20:11:32
245
原创 C#里使用libxl来对列或行进行分组显示
这时候需要使用函数GroupCols和GroupRows来对这些列或行进行分组。需要把某些行进行隐藏起来,那么就需要使用到行或列进行隐藏的操作。分组不能出现交叉的情况,否则会抛出异常。有时候由于EXCEL里的行数很多,
2025-03-22 19:23:11
382
原创 C#代码经过编译生成CIL代码
这张图体现了 .NET 平台的核心特性:通过 CIL 实现不同语言的统一编译输出,再借助 JIT 编译器在运行时将 CIL 转为机器码执行,最终达成跨语言开发和跨平台运行的能力。////解释:在上述微软中间语言(MSIL)中,存在长度为一或两个字节的操作码。所有其他类所继承的基类声明包含在(微软核心库动态链接库)中。在Main()方法里,ldstr指令将字符串 “GeeksforGeeks” 加载到栈上。接着调用静态的函数,字符串从栈中弹出。最后,ret指令标志着函数调用结束。
2025-03-19 11:04:06
82
原创 C# 模块里cctor函数: mono_runtime_run_module_cctor
静态构造函数用于初始化类的静态成员,它在类的任何静态成员被引用之前或创建类的第一个实例之前自动执行,并且每个类只能有一个静态构造函数。静态构造函数没有访问修饰符,也没有参数。静态构造函数不能直接调用,而是由.NET 运行时自动调用。静态构造函数在类被加载时执行一次,且仅执行一次。
2025-03-15 11:04:06
200
原创 使用python来写出数千万行的excel文件的方法
如果采用内存的方法,内存会比较高的。做了一个测试,100万行11列,就要占用3个G内存。这时就需要采用流式写入EXCEL文件,才能输出上千万行数据。但是用户又不想分开文件保存,必须写在一个EXCEL文件里。通这样的方式,就可以写出上亿行的数据。由于数据量越来越大,
2025-03-13 15:16:52
125
原创 C#里最快添加log4net的日志输出
在C#里添加日志支持最快的方法,就是使用log4net。因为它是软件发布之后时行跟踪,调试和改进的关键数据。如果没有日志的软件,必然是一个不成熟的软件。因为它没有办法进行软件的质量改进。日志输出是每一个软件必须的功能,这样就可以有运行的库了。
2025-03-07 15:34:26
220
原创 C#里定义对象序列化保存的例子
C#里定义对象序列化保存的例子由于很多软件有自定义参数,不同的时间使用不同的参数,不同的用户使用不同的参数,这些参数都需要保存到磁盘,以便软件关闭之后再加载出来。面对这样的需求,就需要把软件里参数进行序列化保存,当软件启动时,再把这些参数恢复过来。下面的例子就是使用SerializationInfo 来实现: 代码解释:定义可序列化类:序列化过程:反序列化过程:输出结果:通过这个示例,你可以看到如何使用 类来实现自定义类的序列化和反序列化。
2025-03-03 09:34:25
208
原创 Mono里运行C#脚本44—System.Console.WriteLine()函数的生成过程
类构造函数(静态构造函数)主要用于初始化类的静态成员,它会在类的任何静态成员被引用或者类的实例被创建之前自动执行,并且每个类的静态构造函数只会执行一次。它是从函数mono_runtime_class_init_full开始,它是对整个类的运行时进行初始化,以便这个类可以运行其中的函数。前面已经分析WriteLine() 的调用过程,接着就会找到对应的类Console,然后再找到此类的信息,生成一个类的。要想扫行WriteLine函数,就需要先初始化类的运行环境。获取.cctor的方法名称。
2025-03-02 12:51:53
236
原创 C#里创建异步管道服务器通讯
就是当连接过来的管道没有关闭时,服务端也不能退出程序,它会一直等到客户端关闭为止。在C#里使用同步的管道服务,有一个问题很难处理,因此,使用异步的方法就可以避免这个问题。也没有别的办法去停止这个等待的过程。
2025-02-28 14:26:15
341
原创 C#里使用MSMQ来实现跨进程通讯
消息数量统计:使用 queue.GetMessageEnumerator2() 方法获取队列中消息的枚举器,然后通过 foreach 循环遍历枚举器,每遍历到一条消息,messageCount 计数器就加 1。队列路径定义:queuePath 变量指定了要查看的消息队列的路径,这里使用的是本地私有队列的路径格式。性能影响:遍历队列中的所有消息来统计数量可能会对性能产生一定影响,尤其是在队列中消息数量较多的情况下。一是可以提高并发开发的速度,二是减少一个软件的复杂度。结果输出:最后输出队列中的消息数量。
2025-02-27 14:11:04
254
原创 C#里计算坐标轴的刻度步长的方法
ZedGraph 可以根据曲线中数据值的范围自动选择合适的坐标轴刻度最小值、最大值和步长值。或者,你也可以手动设置其中任意一个或所有这些值,之后刻度选择逻辑会尝试为那些仍处于自动模式的剩余参数选取合适的值。这个数量级会被转换为最高有效数字,然后将其调整为 1、2 或 5,以使刻度成为 10 的整数约数。刻度选择逻辑基于这样一个假设:最符合人类认知习惯的步长应该是 10 的整数约数。也就是说,步长应该是 1、2 或 5 乘以 10 的某个幂次方。通过上面的计算,就可以计算出来以1、2、5为刻度的坐标轴刻度。
2025-02-25 13:32:46
197
原创 C#里使用消息进行进程间通讯
在窗口应用程序之间进行进程通讯,最为方便的方法就是使用WM_COPYDATA消息。当软件开发越来越多功能时,就会导致每个软件代码急剧上升,从而把系统变得越来越复杂。把程序功能分开之后,这样就可以把程序的代码控制在合适的范围内。但是程序与程序之间,还需要协同工作,那么就需要相互进行通讯。这时,我们应对的办法,就是把程序功能拆分。提高了开发人员的效率,减少了系统的复杂度。下面就是使用消息通讯的例子,
2025-02-24 09:47:10
237
原创 Mono里运行C#脚本43—System.Console.WriteLine()函数的生成过程
上面这段代码只是给出一个调用方法void class [mscorlib]System.Console::WriteLine(string)的JIT过程,并没有给方法WriteLine(string)生成代码,这个需要后面将要运行之后,才会找到相应的代码进行编译,才会生成X86-64的代码。要找到这个代码,就需要从文件mscorlib里查找,分别找到命名空间System,类名Console,然后再找到方法WriteLine(string)。在这里调用的代码是库里代码,与前面内部嵌入的函数会不一样。
2025-02-22 12:34:12
160
原创 Mono里运行C#脚本42—mono_arch_create_generic_trampoline函数的生成的汇编代码
下面的代码要与mono_magic_trampoline函数的代码一行一行地对比地查看。才能知道跳板代码怎么样调用mono_magic_trampoline函数。为了更详细地分析跳板代码的运行机制,所以需要查看这个跳板生成的代码,
2025-02-09 22:09:44
214
原创 Mono里运行C#脚本41—编译MonoEmbed::gimme()调用的过程
也就是说在Main()函数进行JIT阶段,就会对函数 MonoEmbed::gimme()进行编译,但不会在此阶段生成它的JIT代码。所以函数mono_lookup_internal_call会找此函数的地址,这样就可以调用函数进行运行了。当Main函数进行JIT时遇到这行代码,就会在函数mono_method_to_ir里面处理。所以在编译这个函数时,就会对函数 MonoEmbed::gimme()进行编译。当运行到这行代码时,就会查找调用方法的属性,也就是方法的唯一签名。
2025-02-06 11:34:53
244
原创 Mono里运行C#脚本40—mono_magic_trampoline函数的参数设置
由于 REX 前缀占 1 字节,操作码占 1 字节,而 mono_atomic_xchg_ptr 函数要操作的是这个 64 位立即数(8 字节)的存储位置,所以从 orig_code 往前偏移 1 + 1 + 8 = 10 字节是 64 位立即数的起始位置,但由于地址计算是从当前位置开始偏移,所以实际偏移量为 11 字节(考虑到指针运算的起始点),即 orig_code - 11 指向的就是需要修改的 64 位立即数的起始地址。因此也会把这些参数传送给函数common_call_trampoline,
2025-02-04 12:55:40
210
原创 Mono里运行C#脚本39—mono_jit_runtime_invoke函数
当脚本MonoEmbed里的Main ()函数JIT编译完成之后,那么就需要在C代码里运行受托管的代码,即是C#的代码。要运行托管的代码,这是需要初始化一个运行环境,以便把参数从C代码传送给托管代码,又需要从托管代码返回值传送回到C代码。create_runtime_invoke_info函数会根据传入参数和返回值参数类型来创建此函数名称。在这里是通过函数mono_jit_runtime_invoke来实现这个过程的。这样就创建一个从C调用托管代码的函数返回。这样就可以进入运行Main函数的过程。
2025-02-01 12:44:55
294
胶囊模型的代码
2018-02-02
python抓取天气并分析 实例源码
2017-08-28
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
开源鸿蒙4.0不能进入桌面的补丁
2024-03-17
开源鸿蒙 4.0 RK3566开发板配置
2024-03-17
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人