- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 MSP430G2553 上实现一个温度传感器,用于读取和输出温度读数以及时间戳。基本要求如下:
• t:显示系统当前时间。以 hhmmss 的形式将系统当前时间输出到串行终端,其中 hh 是 24 小时格式的两位数小时,mm 是小时中的两位数分钟,ss 是分钟中的两位数秒。
• s:设置系统当前时间。将系统的当前时间设置为提供的参数。命令及其参数之间不会有空格。参数的格式为 hhmmss,其中 hh 是 24 小时制的两位数小时,mm 是小时中的两位数分钟,ss 是分钟中的两位数秒。
• o:显示最早的温度读数及其时间戳。将最旧的温度读数及其时间戳输出到串行终端。输出的格式必须为 hhmmss: T,其中 hh 是 24 小时格式中的两位数小时,mm 是小时中的两位数分钟,ss 是分钟中的两位数秒,T 是测量的温度。必须从列表中删除显示的条目。如果未执行任何读数,则会显示消息“未记录温度”。必须显示。
• l:显示所有温度读数及其时间戳。将所有温度读数及其时间戳输出到串行终端。输出应按时间顺序排列,最旧的在前。输出的格式必须为 hhmmss: T,其中 hh 是 24 小时格式中的两位数小时,mm 是小时中的两位数分钟,ss 是分钟中的两位数秒,T 是测量的温度。所有条目都必须从列表中删除。如果未执行任何读数,则会显示消息“未记录温度”。必须显示。您的系统还必须满足以下要求:
• 您必须每五 (5) 分钟捕获一个新的温度读数,并至少存储 32 个温度读数。如果已达到最大温度读数,请丢弃最旧的温度读数,然后再存储新的温度读数。
输入“t”两次后出现错误。下次我输入“t”时,它会输出 3 或 4 个垃圾值。当我注释掉“s”大小写或将“s”更改为不同的变量时,switch语句中的“t”大小写运行得非常好,但是分配的大小写需要在“s”输入到uart中的情况下。到目前为止我尝试过的包括:更改变量,注释掉第二种情况,更改 S 情况的值以确保由于该情况而产生垃圾值,对代码的某些部分进行括号括起来,修改t 案例的整个第一部分更加有效,但仍然出现相同的错误,等等。任何建议都会非常有帮助。 Picture of Garbage Values
#include "msp430g2553.h"
volatile short unsigned int i=0,j=0,k=0;//This the integer that track the number of cycles
volatile short unsigned int timercount=0;//This the integer that track the number of cycles
volatile unsigned int GT=2600;//variable that sets the global time in seconds of the system
volatile char inputcharacters[16];//Input character storage array
volatile unsigned int tempature[32];//
volatile unsigned int tempaturetime[32];
volatile unsigned int d[6]={0,0,0,0,0,0},test[7];
volatile unsigned int h=0;
volatile unsigned int m=0;
volatile unsigned int ss=0;
int temp=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//Disabling watchdogtimer
P1DIR |= BIT0;//setting p1 bit 1 to outy
P1OUT &= ~BIT0;//Shutting off the LED
/* UART config for 9600 baud with SMCLK*/
IE2 = 0x00;//interrupts off on UART
UCA0CTL1 = 0x81;//using SMCLK(1Mhz) and software reset enable
UCA0CTL0 = 0x00;//eight data bits, no parity, one stop bit
UCA0MCTL = 0x02;//Setting UCBRSx to 1 to set clock rate to 9600
UCA0BR0 = 0x68;//set clock rate to 9600 from 1Mhz
UCA0BR1 = 0x00;//set clock rate to 9600
UCA0STAT = 0x00;//error check and parity, and frame error check all off
TACTL = 0x1D0;// sets timer a to use the 32.768kh clock with 8 divisor and in up mode
TACCR0 = 0x1001;// setting the timer to count up to 4097 to get a 1hz(1s) oscillation
TACCTL0 &= 0xFFEF;// disable capture compare interrupts
P1SEL|=0X06;// According to slas735j both p1.1(0X02) and p1.2(0X04) need to be set on to receive and send on the UART
P1SEL2|=0X06;
ADC10CTL0 &= ENC;
ADC10CTL0 = SREF_1 | ADC10SHT_3 | REFON | ADC10ON;
ADC10CTL1 = INCH_10 | ADC10DIV_2 | ADC10SSEL_3;
//ADC10CTL0 = 0x3030;
//ADC10CTL1 = 0xA038;
ADC10CTL0 &= 0xFFFC;
/* Enable USCI logic and Enable interrupts */
UCA0CTL1 &= 0xFE;//turning on USCI logic
IE2 = 0x01;// Sets UART to receive interrupt
TACCTL0 = CCIE;// set timerA interupts on done last
__bis_SR_register(LPM3_bits + GIE);//found on TI wiki
}
#pragma vector=USCIAB0RX_VECTOR// This vector name was pulled from the webcources code
__interrupt void uartinput(void)//this form found on TI's wiki
{
inputcharacters[i] = UCA0RXBUF;
UCA0TXBUF = UCA0RXBUF;
if((i>14)||(inputcharacters[i]=='\r'))
{if(inputcharacters[i]=='\r'){inputcharacters[i]=0;}//to reduce i, the number of inputs so that we dont count the \r
for(j=0;j<i;j++){switch(inputcharacters[j]) {//switch statement that check the input characters and outputs the correct morse
case 't' :
h=GT/3600;
m=(GT-h*3600)/60;
ss=GT-h*3600-m*60;
d[0]=(h/10);
d[1]=(h-(d[0]*10));
d[2]=(m/10);
d[3]=(m-(d[2]*10));
d[4]=(ss/10);
d[5]=(ss-(d[4]*10));
for(k=0;k<6;k++)
{while((IFG2 & 0x02)==0)
{;}
UCA0TXBUF=d[k]+48;
test[k]=d[k]+48;}
while((IFG2 & 0x02)==0)
{;}
UCA0TXBUF='\r';
break;
case 'x' ://If this break case is not set to 's' it will not cause the error in the 't' case, no idea why
GT=0;
temp=(inputcharacters[j+1]-0x30)*10;//
temp+=(inputcharacters[j+2]-0x30);
GT+=(temp*3600);
temp=(inputcharacters[j+3]-0x30)*10;
temp+=(inputcharacters[j+4]-0x30);
GT+=(temp*60);
temp=(inputcharacters[j+5]-0x30)*10;
temp+=(inputcharacters[j+6]-0x30);
GT+=temp;
j+=7;
break;
case 'o' :
{;}
break;
case 'l' :
{;}
break;
case '\r' :
{;}
break;
default :
{i++;}
}}
i=0;
j=0;
}
else{i++;}}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_interupt(void)
{
if(GT<86459)//24:00:59 in seconds
{GT++;}//add a second
else
{GT=60;}//00:01:00
if(timercount<299)//300s=5min
{timercount++;}
else{timercount=0;
ADC10CTL0 |= 0x3;// turn on ADC
while(ADC10CTL1 & ADC10BUSY)//loop to alow for ADC to finish sampeling
{;;}
ADC10CTL0 & 0xFFFE;//Shuting off the ADC after sampeling
tempature[i]=ADC10MEM;//Storing the tempature
tempaturetime[i]=GT;// storing the time
if(i<31)
{i++;}
else
{i=0;}
}
}
最佳答案
所发布代码的一个非常明显的问题是,当发现当前正在检查的输入字符为x
时,必须在用户输入后输入新的日期戳(作为6位数字) x
但在用户输入 \r
之前,这可以工作,但没有代码强制执行该输入序列。
一般来说,uart 输入函数应包含多个“状态和子状态”,其中命令字符导致代码切换到“状态”,并且该状态将具有实际时间戳的子状态。因此,当用户输入命令(例如 x
)时,会设置一个模式,其中输入的接下来的 6 位数字是新的时间戳。
建议设计一个“上下文敏感”状态图,然后实现该图。
除此之外,输入缓冲区的大小将减少到 1 个字节
在许多排序问题中,有一个事实是,当积累一些数字时,会说这样的话
int temp = 0;
temp += inputchar[x] - 0x30;
temp += inputchar[x+1] - 0x30;
...
不会产生预期的结果。
产生预期结果的是:
int temp = 0;
temp += inputchar[x] - 0x30;
temp = temp*10 + (inputchar[x+1] - 0x30);
....
temp = temp*10 + (inputchar[x+5] - 0x30);
GT = temp;
当然,在尝试将该输入应用于 temp
的计算之前,使用 if( isdigit( inputchar[x] ) 测试每个 inputchar
为了便于开发,强烈建议一次只尝试执行一个命令并且当该命令正常工作时(广泛使用调试器以使测试变得容易。例如jtag
该芯片的调试器。)然后继续执行下一个要实现的命令。
变量i
正在两个中断处理程序中被修改。因此,当一个中断处理程序修改 i
时,另一个中断的值就会被破坏。
一整天(24 小时)是 878400 秒,因此值 86459 不正确。另外,这是代码中的一个“神奇”数字。魔法数字没有依据。 “神奇”的数字使代码更加难以理解、调试和维护。建议使用 enum
语句或 #define
语句为该“神奇”数字指定一个有意义的名称,然后在整个代码中使用该有意义的名称。注意:将 GT
计数器重置为 60 是不正确的,在发布的代码中应将其重置为 0。
对于“神奇”数字 300 也存在类似的考虑。
当输入命令为l
时,发布的代码没有任何 Action ,因此我们无法分析这样的(不存在的)代码来确定它出了什么问题。
在t
命令的处理中:
GT
变量在访问之间可能会发生修改。建议保存到"new"变量并从该新变量进行所有计算。
h
、m
和 s
的计算正在对相同的中间变量执行大量重新计算。建议:
int myGT = GT;
h = myGT / 3600;
myGT %= 3600;
m = myGT / 60;
s = myGT % 60;
数组test[]
已设置但未使用。这是生产代码中的资源浪费。建议其存在和设置由某些-D
编译器参数确定。
关于c - 为什么我输入两次 't' 时得到的是垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42916723/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!