是否有一种简单的方法可以确保数据类型在C/C++中的不同平台和体系结构中保持相同的大小?
在C++中,假设我编写了一个假设的,简单的程序:
#include <iostream>
int foo;
int main(void)
{
std::cout<<"Size of foo is "<<sizeof(foo)<<" bytes."<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所有这个程序都打印任意整数数据类型的大小并退出.在我的机器上,它返回foo4个字节的大小(我有一个64位机器).
但是,假设我为Arduino或其他ATMega驱动板编写此程序:
int foo;
void setup()
{
Serial.begin(9600);
Serial.print("Size of foo is ");
Serial.print(sizeof(foo));
Serial.println(" bytes.");
}
void loop(){}
Run Code Online (Sandbox Code Playgroud)
在我的Arduino UNO板上,这只返回2(与short我的机器相同的大小).
是否可以创建(优选跨平台)标头或声明以确保数据类型的大小是一定的大小,以免遇到精度问题或数量非常大的问题?
理想情况下,这不仅可以用于Arduino板,还可以用于其他紧凑型MCU(如PicKit).
我对Arduino和整个Arduino IDE都比较陌生,所以请原谅我,如果我错过了一些非常简单的东西.
我正在开发将在LCD上显示输出的系统。
我将变量数据类型声明为float,但是LCD显示屏显示0.00而不初始化,因为我用0.0声明了它,所以
我希望LCD显示屏显示0.000,但是无论我如何尝试更改初始化值,LCD显示屏始终显示0.00
因此,如何使LCD显示屏显示0.000,
这是图像的链接,
下面是我的代码:
#include <LiquidCrystal.h>
volatile int NbTopsFan;
float flowrate = 0.0;
float volume = 0.0;
int hallSensor = 2;
LiquidCrystal lcd (12, 11, 9, 8, 7, 6);
void rpm() {
NbTopsFan++;
}
void setup(){
pinMode(3, OUTPUT);
pinMode (hallSensor, INPUT);
Serial.begin (9600);
attachInterrupt (0, rpm, RISING);
lcd.begin (16, 2);
lcd.clear ();
}
void loop (){
digitalWrite(3, HIGH);
NbTopsFan=0;
sei();
delay(1000);
cli();
flowrate = NbTopsFan / 7.5;
volume += (flowrate …Run Code Online (Sandbox Code Playgroud) 我试图了解当您打开/关闭Arduino Uno上的LED时,"引擎盖下"会发生什么.
带有硬件项目的基本Hello World似乎是闪烁的板载LED.在Arduino的情况下,有一个LED连接到引脚12.
我看了一下源代码digitalWrite:
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN)
return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER)
turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
}
else {
*out …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的十六进制字符串:“0005607947”并想将其转换为十进制数,我在此站点上对其进行了测试,它正确地转换为十进制数,答案是:“90208583”但是当我使用此代码时,我得到了错误的值!我的代码哪里出错了,或者确实有任何代码,针对此问题的一些新代码?
long int decimal_answer = getDEC("0005607947") ;
long int getDEC(String str110) {
long int ID = 0 ;
int len = str110.length() ;
char buff[len] ;
int power = 0 ;
for(int i = 0 ; i <len ; i++) { buff[i] = str110.charAt(i); }
for(int i = (len-1) ; i >=0 ; i--) {
int num = buff[i] - '0' ;
ID = ID + num * pow(16 , power) ;
power = power + 1 ; …Run Code Online (Sandbox Code Playgroud) 我有一个 Arduino Uno,无论我如何尝试,它都不会被我的计算机识别。
我在 64 位戴尔 Inspiron 笔记本电脑上运行 Windows 10 家庭版。
已通过 Arduino 网站上的官方可执行文件安装了 arduino 软件和驱动程序。正确的 .inf 文件位于 Arduino/drivers 目录中。
预期的行为是通过 USB 插入 Arduino,转到设备管理器,然后在端口部分或可能的其他设备部分中找到 Arduino。
没有端口或其他设备部分。但有一个
“未知 USB 设备(设备描述符请求失败)”
通用串行总线控制器部分中的线。这是 Arduino,当我拔掉 Uno 时,该设备就会从 USB 控制器部分消失。
(顺便说一下,当我插入 Arduino 时,我收到一条通知,提示最近插入的设备出现故障,Windows 无法识别它。)
右键单击并转到“未知设备”的属性,会显示以下状态:Windows 已停止此设备,因为它报告了问题。(代码 43)USB 设备描述符请求失败。
尝试通过直接将驱动程序指向正确的目录来更新驱动程序会显示一条消息,表明它已经拥有最新的驱动程序。但是,转到“设备管理器”中的“驱动程序详细信息”时会显示:该设备不需要或尚未加载任何驱动程序文件。
我已经禁用了驱动程序签名验证。还是没有喜悦。
我已经更新了 Windows。我已尝试确保所有其他 USB 相关驱动程序均已更新。当我尝试更新时,Windows 至少说是这样。
有人有什么想法吗?
我带了一个esp8266-12,它工作在115200波特率.我有时将它连接到arduino uno以便为某些项目工作.如果我以9600波特率将esp8266与arduino连接起来会很容易.AT版本是0.25.我用谷歌搜索并看到AT命令集文档,它有一个设置波特率的命令.它就像
AT+ UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
Run Code Online (Sandbox Code Playgroud)
但问题是我不知道这些参数是什么以及如何设置参数,以便使用arduino以9600波特率工作.
我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。
AVR 计算器产生:
ICR1 = 20833
OCR1A = 4167
Run Code Online (Sandbox Code Playgroud)
我已经阅读了大量的论坛和 tuts 但由于某种原因我无法让它工作。
下面是我的代码:
void setup()
{
// PB1 is now an output (Pin9 Arduino UNO)
DDRB |= (1 << DDB1);
// PB2 is now an output (Pin10 Arduino UNO)
DDRB |= (1 << DDB2);
// Set PWM frequency/top value
ICR1 = 20833;
// Set PWM duty cycle
OCR1A = 4167;
// Set inverting mode (start low, go high)
TCCR1A |= (1 << …Run Code Online (Sandbox Code Playgroud) 我正在 Arduino 中制作一个非常简单的项目,除了将单击读取为保持的按钮之外,一切都工作正常,我希望将其读取为单击。
我有一个连接到我的 Arduino 的数字显示器,它应该显示数字 5,一旦我单击按钮,数字应该增加 5,但是当我单击时,它会不断增加 5,直到我放开,所以单击一下就会从5 到 155,而不是 10。
buttonState = digitalRead (btnPin);
if (buttonState == LOW)
{
leilao = leilao + 5;
sevseg.setNumber(leilao);
sevseg.refreshDisplay();
previousMillis = currentMillis;
}
Run Code Online (Sandbox Code Playgroud)
“leilao”是应该增加 5 的值。
getID()我有一个从 EEPROM 返回一个字节的函数:
byte getID(){
return (byte)EEPROM.read(0x0199);
}
Run Code Online (Sandbox Code Playgroud)
后来,(第 65 行),我使用此函数并将其与二进制值进行按位或:
byte out[3] = {getID()|B10000000, B00000001, B00000001};
Serial.write(out,3);
Run Code Online (Sandbox Code Playgroud)
它返回从“int”到“byte”的“缩小转换”:
file.ino:65:33: warning: narrowing conversion of '(int)(((unsigned char)((int)getID())) | 128)' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
byte out[3] = {(getID())|B10000000, B00000001, B00000001};
Run Code Online (Sandbox Code Playgroud)
这只是一个警告,代码工作正常(我认为),但为什么这是一个缩小转换?我试过确保几乎所有东西都是一个字节......
所以我一直在为我的arduino编程,这是c ++的一些变体.我一直在编写一个程序来勾选每个4位七段显示器的数字.我一直无法将引脚[]设置为不同长度的不同阵列.
例如,显示一个装置将打开2个引脚,这些引脚在阵列中表示int one[] = {1,2};并显示四个引脚int four[] = {1,2,3,4};.
我一直在尝试的是:
int pins[] = null;
int one[] = {1,2};
int four[] = {1,2,3,4};
switch(num) {
case 1: pins = one; break;
case 4: pins = four; break;
}
Run Code Online (Sandbox Code Playgroud)
然而,这已经造成了问题,并且不允许我上传它,因为事情到处都是破坏.
我对c ++知之甚少,只是它与Java类似,我对此非常了解.
我觉得我喂养的鲨鱼没有足够的保护,我的代码中的这一点让我烦恼.
我的问题是你如何初始化一个数组,但稍后再改变它?
arduino-uno ×10
arduino ×8
c++ ×3
arduino-ide ×2
c ×2
arrays ×1
at-command ×1
decimal ×1
esp8266 ×1
hardware ×1
hex ×1
lcd ×1
pwm ×1
types ×1
windows ×1