改变设备管理器中的属性
我正在使用串行设备,我想与微控制器通信我的计算机.在我的C#程序中,我可以设置波特率,停止位,数据位等.这些只是在我的C#程序中. 例如,我在MicroController和C#程序中设置了Baud Rate 115200,但是当我在设备管理器中看到设备的属性时,Baud速率仍在使用默认值为9600 bps.我不知道使用115200bps以及使用9600bps的属性,我的C#程序和微控制器是否不错,但是通信工作. 如何更改设备管理器中设备的属性? 解决方案 当您在C#程序中设置串行端口时,它将使用Win32 SetCommstate API进行操作.无论您使用的串行通信库如何,这都是事实.但是,Win32 SetCommstate API将永远不会更改设备管理器中显示的波特率. 设备管理器中显示的值来自设备的驱动程序,当您未在程序中明确设置它时,它是使用的默认值.安装驱动程序后,该值写入Windows注册表. 只要您在程序中设置它,就不必担心设备管理器中显
0 2024-04-25
编程技术问答社区
是否有可能只用C#编程来模拟com端口发送和接收数据?
我有一个设备,该设备通过计算机上的COM端口发送数据. 我知道如何模拟它,但是必须插入控制器以模拟发送数据(使用proteus) 是否可以模拟com端口发送数据而无需插入任何外部设备? 例如:我想编写一个C#程序,该程序打开COM端口并等待数据,以及在同一端口上写入数据的另一个C#程序. 解决方案 做到这一点的最佳方法是使用软件com端口模拟器.我使用com0com: null-modem仿真器 这提供了系统上的虚拟NM COM端口对(即,输出的输出是输入到另一个的,反之亦然).这些设备像真实的COM端口一样出现在设备管理器中,因此您在C#中与它们进行交互,好像它们是真实的硬件设备一样. 其他解决方案 为了简单起见,请自己获得COM端口或null调制解调器模拟器.您会远离轨道,也许浪费很多时间,试图自己做. 也请参见这篇文章: 伪造RS232 RS232串行端口
8 2024-04-18
编程技术问答社区
将C#调试输出写入.txt文件
我正在使用 .net micro Framework 我想要的,我想要我的调试输出写入文本文件.这是如何工作的? 解决方案 使用 trace .它旨在做您需要的事情. using System; using System.Diagnostics; class Test { static void Main() { Trace.Listeners.Add(new TextWriterTraceListener("yourlog.log")); Trace.AutoFlush = true; Trace.Indent(); Trace.WriteLine("Entering Main"); Console.WriteLine("Hello World."); Trace.WriteLine("Exiting Main"); Trace.Unindent();
0 2024-04-12
编程技术问答社区
在微控制器编程的ISR功能中使用volatile关键字
作为ISR函数中使用的一般概念全局变量("值"),应声明为挥发性,以避免编译器优化.但是,我的疑问是在ISR中调用的子功能" ISR-SUB"中使用的全局变量,是否还需要将ISR中调用的全局变量使用为挥发性? unsigned int STATUS; // -----> needs to be declared as volatile ? void ISR-SUB() { STATUS = 1; -->accessed in sub function invoked in ISR which will be optimized or not } void ISR () { ISR-SUB(); } void main() { /* interrupt occurred and ISR called */ if (1 == STATUS) { code part } } 解决方案 当然你会. volatile不是ISR的特权,它在
10 2024-04-10
编程技术问答社区
拷贝数据耗时太多
我对循环副本的时间有一些问题,我不为什么要花费大量时间来复制小数据大小. 我使用的是PIC24FJ256GL406 MCU,一切都很好,但是当操作UART微控制器运行速度很慢,因为在复制缓冲区数据时发生了一些延迟. 让我用代码和调试日志解释您. 在这里,我正在为UART传输张贴功能.该函数通常仅传输第一个字符,其余字节将在中断常规服务中转移. 我的时钟频率为32MHz,因此外围为16 MHz. 我不明白为什么循环仅用于16个字节数据的副本将近20毫秒.因此,如果数据更多,这次将增加. unsigned int UART1_WriteBuffer(const uint8_t *buffer, const unsigned int bufLen) { //transmit first char U1TXREG = buffer[0]; while (!U1STAbits.TRMT); numBytesWritten = bufLe
6 2024-04-10
编程技术问答社区
如何访问外部SDRAM中的变量
我正在使用TM4C1294 + CCS 6.0.1 + Ti 5.1.9(编译器). 8MB外部SDRAM中的阅读/写作变量工作正常,例如g_pui16EPISdram = (uint16_t *)0x60000000; g_pui16EPISdram[SDRAM_END_ADDRESS ] = 0xdcba; 但是,由于我使用"属性指令"来访问外部SDRAM如下:int abab[20]__attribute__ ((section (".external")));,该程序甚至都没有执行. ".外部"定义.cmd: SDRAM (RWX) : origin = 0x60000000, length = 0x00800000 SECTIONS { .intvecs: > APP_BASE .text : > FLASH .const : > FLASH .cinit : > FLASH .pinit :
8 2024-04-10
编程技术问答社区
STM32应用程序有时不能运行,一直处于DFU状态
更新: STM32L4板的问题有时在DFU更新后不会运行,跳到编辑2以获取短篇小说和示例代码. 我正在使用基于STM32L4的自定义板进行项目. 在将字符串通过USB发送之前,我一直在格式化字符串时遇到问题. 当使用USB上的DFU更新MCU时,问题就会发生,在调试模式下一切正常(使用stlink). 当将3个以上的参数传递给sprintf时,MCU会离开DFU模式,但是该应用程序永远不会启动(没有初始步骤,没有运行,什么也没有). 我已经追踪了引起问题的线路: sprintf(tx_buffer, "Hello World: %ld/%ld/%ld\r\n", 1,2,3); // OK sprintf(tx_buffer, "Hello World: %ld/%ld/%ld, %ld\r\n", 1,2,3, 4); // NOK sprintf(tx_buffer, "Hello World: %d/%d/%d\r\n", 1,2
20 2024-04-10
编程技术问答社区
微控制器内存分配
我一直在考虑以下问题: 在共同的PC中,当您分配一些内存时,您向操作系统要求它,该操作系统跟踪哪些内存段被占据,哪些段不在,并且不要让您与其他程序内存等. 但是,微控制器呢,我的意思是微控制器没有运行的操作系统,所以当您要求一堆内存时,发生了什么事?您不能简单地放置内存芯片和随机位置,因为它可能会被占用...谁可以跟踪已占用的内存部分,并为您提供免费存储东西的地方? 编辑: 我已经在C中对微控制器进行了编程,我认为答案可能是"独立语言"的.但是,让我更加清楚:SOPOSE我有这个程序在微控制器上运行: int i=0; int d=3; 是什么确保我的I和D变量未存储在内存中的同一位置? 解决方案 我认为评论已经介绍了这一点... 要求内存意味着您有一些操作系统管理您正在杂乱的内存(使用术语操作系统的宽松感).首先,您不应该将Mallocemoter在微控制器中作为一般规则(我可能会为该语句燃烧).可以在情况下完成,但是您可以控制内存,您使用应用
10 2024-04-10
编程技术问答社区
如何在不使用库的情况下将整数阵列转换为字符串
所以我正在从事一个实习项目. 我必须开发一个将收集一些数据的系统,然后将其发送到服务器.该系统由MSP430G2553微控制器组成,因此我在没有任何库的纯C中编码,因此我可以使用Sprintf或Malloc功能. 目前我遇到的问题是我不知道如何一次将数组中的所有数据发送到服务器. i具有20个值的数组adcvalue [20],范围从0-350 ADCvalue[20]= {10, 40, 50, 90, 100, 200, 300, 240, 260, 10, 40, 50, 90, 100, 200, 300, 240, 260, 300, 20}. 现在,我想在每个值之间向服务器之间一次发送这些值. 这样: 10,40,50,90,100,200,300,240,260,10,40,50,90,100,200,300,240,260,300,20 如何获得这样的数组并立即发送?我已经有一个可以发送的打印功能:char property[] =
4 2024-04-10
编程技术问答社区
Nucleo STM32f103RB/F4的发现
是否有人使用VCP在核/或Discovery单一USART上使用RX TX中断的单一USART进行了使用. 会喜欢示例代码回声回声(传输)收到的内容. 解决方案 stm32cubef1 package. 另外,请参见此示例,其中微控制器echos使用UART RX中断将接收到的字节回到发送方: : #include "stm32f4xx.h" UART_HandleTypeDef huart2; /* Single byte to store input */ uint8_t byte; void SystemClock_Config(void); /* UART2 Interrupt Service Routine */ void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } /* This callback is called by the HAL_UART_IRQHand
10 2024-04-10
编程技术问答社区
如何在C语言中缩放一个数字/数字范围
我希望能够在我的LCD模块上显示从0英尺到20000英尺的ft中的高度.这些数字是从电位器中读取的,我可以旋转以更改值.目前,电位计的显示为0到1023,但我需要适当地缩放它们,以便它们从0-20000英尺读取.除此之外,我希望下面的行显示"条形图"以表示高度增加. LCD每行有20个块,因此条形图可以从1块到20个街区. sprintf(buf, "Altitude: %d ", DELVAL2); // display altitude level lcd_putxy(1,0,buf); for (delay = 0; delay
10 2024-04-10
编程技术问答社区
微控制器中的挥发性关键字
volatile关键字告诉编译器不要优化前缀的变量.该变量可能会在运行时间内通过未知来源(编译器不知道)在外部中断等. volatile还有其他优势吗? volatile是否适用于从文件中读取? 解决方案 volatile关键字对编译器表示不优化带有前缀的变量,该变量在运行时间期间可能会通过未知来源(编译器不知道)在外部中断等. 否. volatile关键字不会告诉编译器禁用或不优化变量; volatile关键字告诉编译器,可以将变量(或变量代表的内存)在外部进行修改. 这具有编译器不再能够进行必要的分析以确定各种优化是否安全(在功能等效上)的效果,因此编译器不执行这些优化.这是必要的副作用,但不是关键字存在的主要目的. 用作volatile作为某种或略微便携式的hack,就像pragma一样,用于禁用编译器的优化是一种相当常见的模式.在嵌入式编程之外,这可能是应用程序编程人员最常见的用法. 编译器知道该控制器的所有中断.因此,在这种情况下,vo
8 2024-04-10
编程技术问答社区
如何将一个比特字段(通过引用)传递给一个函数?
我的问题是如何通过引用函数传递BitField实例.我已经执行了此操作,如下所示,但是当我启用功能DAC_SET_GAIN_CODE时,处理器会抛出Interupt故障.就通过比特菲尔德而言,我做的正确吗? 我创建了一个Bitfield(请参阅下文),该Bitfield代表DAC芯片上的24位寄存器,我想将其写入.H文件中. typedef struct { uint8_t rdwr_u8: 1; uint8_t not_used_u8: 3; uint8_t address_u8: 4; uint8_t reserved_u8: 8; uint8_t data_u8: 8; }GAIN_REG_st; 我有一个功能,可以像这样初始化比特菲尔德: void init(void) { GAIN_REG_st GAIN_x; //Create instance of bit
6 2024-04-09
编程技术问答社区
显示以前收到的UART值
这应该很容易回答熟悉的人.我想在LCD上显示以前的变量值(在微控制器上接收寄存器(RS-232)).这是我当前的实现,它可以正常运行.但是我想知道是否有一种方法可以在我的中断中花费更少的时间.当前,一旦在UART feed中收到一个新字符,外围设备被配置为跳到中断例程.建议有人吗? //Initialization char U1RX_data = '\0'; char p0_U1RX_data = '\0'; char p1_U1RX_data = '\0'; char p2_U1RX_data = '\0'; char p3_U1RX_data = '\0'; char p4_U1RX_data = '\0'; char p5_U1RX_data = '\0'; char p6_U1RX_data = '\0'; char p7_U1RX_data = '\0'; char U1buf[] = {p7_U1RX_data, p6_U1RX_data, p5_U1RX_data
6 2024-04-09
编程技术问答社区
为什么PIC18上的定时器1不计数?
最初,我的timer0在运行模式下工作正常.唯一的问题是设备进入睡眠模式时,timer0停止计数直到唤醒.在数据表中,它说使用timer1能够在睡眠模式下监视时间. 我将现有代码修改为timer1新配置,其他代码几乎相同.但是,我可能错过的timer1与timer0有所不同,因为Timer1根本没有计算.我正在使用的图片是 pic18f87j11 带有mplab c18. 我将共享似乎相关的代码,并应要求根据需要添加更多. timer0 摘要代码(来自标题文件) #define TMR_IF INTCONbits.TMR0IF #define TMR_IE INTCONbits.TMR0IE #define TMR_IP INTCON2bits.TMR0IP #define TMR_ON T0CONbits.TMR0ON #define TMR_CON T0CON #define T
10 2024-04-09
编程技术问答社区
在IAR单片机中,sprintf破坏了数组
我目前正在学习嵌入式编程,因此使用ARM架构的Ti微控制器在IAR平台上工作.由于我根本不熟悉与此类编程或C编程有关的技术,因此我想问一个基本问题: 我有以下简单代码段: int i; for(i = 0; i
8 2024-04-09
编程技术问答社区
擦除外部FLASH
我正在使用MCF51EM256 Freescale MicroController,并且我有一些问题将数据存储在外部闪存中以使其持久. 我需要存储此结构: typedef struct { ui64_s Ea_ps; ui64_s Ea_ng; ui64_s Er_q1; ui64_s Er_q2; ui64_s Er_q3; ui64_s Er_q4; uint16 F_ea; uint16 F_er; }Ws_EnergyAcc64; 其中: typedef union{ uint64 v; uint32 p[2]; } ui64_s; 和: typedef unsigned long long int uint64; typedef unsigned long int uint32; typedef unsigned short int uint16; 为了做到这一点,我已经实现了此功能:
10 2024-04-09
编程技术问答社区
用MCU定时器/中断来计算秒和分钟?
我试图弄清楚如何为我的C8051F020 MCU创建计时器.以下代码使用以下公式传递给init_Timer2()的值: 65535-(0.1/(12/2000000)= 48868. 我设置了计时器,以计数每次执行时,每10个计数,每10秒钟.这是基于上述公式. 48868传递到init_Timer2时,将产生0.1秒的延迟.每秒需要十个.但是,当我测试计时器时,它有点快.计时器在十秒钟内报告了11秒,在20秒时,计时器报告了22秒.我想尽我所能. 这是我的代码: #include #include void init_Clock(void); void init_Watchdog(void); void init_Ports(void); void init_Timer2(unsigned int counts); void start_Timer2(void); void timer2
2 2024-04-09
编程技术问答社区
如何在MPLAB C18中使用内联装配?
我正在使用MPLAB C18,该MPLAB C18提供了一个内部汇编器来启用C项目中调用汇编功能.我正在遵循有关如何使用内联装配的规则,我怀疑必须将有关'全文mnemonics用于表读/写入/写入'的某些内容在构建我的项目时会导致语法错误消息. The internal assembler differs from the MPASM assembler as follows: No directive support Comments must be C or C++ notation Full text mnemonics must be used for table reads/writes. i.e., TBLRD TBLRDPOSTDEC TBLRDPOSTINC TBLRDPREINC TBLWT TBLWTPOSTDEC TBLWTPOSTINC TBLWTPREINC No defaults for instruction operands - all ope
12 2024-04-09
编程技术问答社区
如何正确计算计时器溢出以将32位高分辨率计时器转换为64位高分辨率计时器
I have a 32-bit core timer on a PIC32MZ microcontroller ( datasheet )计数为100 MHz. 系统正在运行具有多个任务(线程)的Freertos,并且该代码应随时从任何任务接听. 它每2^32滴答/100000000 tick/sec = 42.9秒.我想安全地将其转换为64位计数器. 有一个ISR处理计数溢出.看起来像这样: static volatile uint32_t rollover_count = 0; void isr_core_timer_overflow() { rollover_count++; } 这个概念也将在8位微控制器上使用,从8位计数器转换为16位或32位计数器. 这是我提出的解决方案: // For 32-bit mcus such as PIC32 uint64_t get_counts() { uint32_t count1 =
8 2024-04-09
编程技术问答社区