我有一段在嵌入式系统上运行的代码。它的工作是将一些ASCII字符转换为专有数据。数据存储在一个多维数组中,虽然我无法通过硬件调试器确认这一点,但是看起来是什么问题,因为位变量保持在值2.这段代码的前两次是有效的。运行,但在第三次运行时它会中断并返回开始通过UART接口发送错误的数据。我可能也许其他人分析这个可能会看到我所缺少的东西。这是C99,我不太熟悉。 Bleow是整个函数,但我认为问题在于for语句?任何帮助将不胜感激!
void simple_uart_putstring(uint8_t *str, uint16_t length)
{
//send data bits
uint_fast8_t index = 0;
uint8_t ch = str[index++];
uint_fast8_t bitCount = 0;
int index2 = 0;
int bit = 0;
if (length > 1)
{
while (length >= index)
{
if (bitCount < 2)
{
if (length < 10)
{
//send sync bits
simple_uart_put(254);
simple_uart_put(223);
bitCount = 2;
} else {
//send sync bits and add scrolling
simple_uart_put(254);
simple_uart_put(222);
bitCount = 2;
}
}
//send each bit for each letter in the string
for (uint_fast8_t i = 0; i < 5; i++)
{
index2 = (int)ch;
bit = (int)i;
simple_uart_put(matrix[index2 - 32][bit]);
bitCount++;
}
ch = str[index++];
}
//the main controller is expecting 150 bits total to continue to send bit until 150
while (bitCount <= 150)
{
simple_uart_put(0);
bitCount++;
if(bitCount >= 150)
{
bitCount = 0;
break;
}
}
bitCount = 0;
}
}
这是一个数组样本:
const uint8_t matrix[59][5] =
{
{ 0, 0, 0, 0, 0}, //space
{ 0, 125, 0, 0, 0}, //!
{ 0, 112, 0, 112, 0}, //"
{127, 127, 127, 127, 127 }, //#
{ 18, 42, 107, 36, 0}, //$
{ 50, 52, 22, 38, 0}, //%
{ 38, 89, 57, 6, 9}, //&
{ 64, 48, 0, 0, 0}, //'
{ 0, 0, 62, 65, 0}, //(
{ 0, 65, 62, 0, 0}, //)
{ 20, 8, 62, 8, 20}, //*
{ 0, 8, 28, 8, 0}, //+
{ 1, 6, 0, 0, 0}, //,
{ 0, 8, 8, 8, 0}, //-
{ 3, 3, 0, 0, 0}, //.
{ 2, 4, 8, 16, 32}, //
{ 62, 69, 73, 62, 0}, //0
{ 1, 33, 127, 1, 0}, //1
{ 35, 67, 69, 49, 0}, //2
{ 34, 73, 73, 54, 0}, //3
{ 12, 20, 36, 127, 0}, //4
{ 114, 81, 81, 78, 0}, //5
{ 30, 41, 73, 6, 0}, //6
{ 64, 71, 72, 112, 0}, //7
{ 54, 73, 73, 54, 0}, //8
{ 48, 73, 74, 60, 0}, //9
{ 0, 54, 54, 0, 0}, //:
{ 0, 1, 54, 0, 0}, //;
{ 0, 8, 20, 34, 0}, //<
{ 0, 20, 20, 20, 0}, //=
{ 0, 34, 20, 8, 0}, //>
{ 32, 64, 69, 72, 48}, //?
{ 62, 65, 93, 93, 112}, //@
{ 63, 72, 72, 63, 0 }, //a
{ 127, 73, 73, 54, 0 }, //b
{ 62, 65, 65, 34, 0}, //c
{ 127, 65, 34, 28, 0 }, //d
{ 127, 73, 73, 65, 0}, //e
{ 127, 72, 72, 64, 0}, //f
{ 62, 65, 73, 47, 0}, //g
{ 127, 8, 8, 127, 0}, //h
{ 0, 65, 127, 65, 0},//i
{ 6, 65, 126, 64, 0}, //j
{ 127, 8, 20, 99, 0}, //k
{ 127, 1, 1, 1, 0}, //l
{ 127, 32, 24, 32, 127}, //m
{ 127, 16, 8, 127, 0}, //n
{ 62, 65, 65, 62, 0}, //o
{ 127, 72, 72, 48, 0}, //p
{ 60, 70, 66, 61, 0}, //q
{ 127, 76, 74, 49, 0}, //r
{ 50, 73, 73, 38, 0}, //s
{ 0, 64, 127, 64, 0}, //t
{ 126, 1, 1, 126, 0},
{ 127, 1, 2, 124, 0},
{ 126, 1, 6, 1, 126},
{ 99, 28, 28, 99, 0},
{ 112, 8, 8, 127, 0},
{ 71, 73, 81, 97, 0}};
和uart发送方法:
void simple_uart_put(uint8_t cr)
{
NRF_UART0->TXD = (uint8_t)cr;
while (NRF_UART0->EVENTS_TXDRDY!=1)
{
// Wait for TXD data to be sent
}
NRF_UART0->EVENTS_TXDRDY=0;
}
这种工作的一个例子是输入字符串是“AB”并且长度= 2; 它应该通过UART发送以下字节:
{254, 223, 63, 72, 72, 63, 0, 127, 73, 73, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, etc....}
前两个字节是同步字节,接下来的五个字节来自数组matrix[33][0 to 4]
,因为ASCII'A'= 65和65-32 = 33.然后接下来的五个来自ASCII'B'= 66并且66 - 32 = 34所以它们是从matrix[34][0 to 4]
发送的。然后下一个n = 150-bitNumber被发送为0,因为主控制器总是期望150个字节。
答案 0 :(得分:1)
请参阅底部的修改
如果没有所有功能的定义,我无法完全分析这一点,但有一些可疑的事情:
1) 此声明为奇数:
uint_fast8_t index = 0;
uint8_t ch = str[index++]; //always sets ch to first character of input "str" then increments index.
注意: 更正了上一行的评论。
2) 虽然评论表明“字符串中每个字母的每个位”但它只处理5:
for (uint_fast8_t i = 0; i < 5; i++){...} //what if lenth of input is less than 5?
建议改为:
for (uint_fast8_t i = 0; i < length; i++){...} //used second argument "length"
3) 最后,似乎null终止字符串应该遵循for循环,但是:(见行中的注释)(另外,使用的输入参数是“ abc“,4)
for (uint_fast8_t i = 0; i < 5; i++)
{
index2 = (int)ch; //ch inits to first char in str, and indexes through
bit = (int)i;
//simple_uart_put(matrix[index2 - 32][bit]);
bitCount++;
}
ch = str[index++]; //terminates in second character of input "b' in this case
//I think this should null terminate with '\0' if it is to be treated as a C string,
//but because, as you say, this is "proprietary", I am not sure.
编辑
我认为问题可能是你已经使用看起来足够的空间来声明变量矩阵,但只用三行数据初始化它:
const uint8_t matrix[59][5] =
{
{ 0, 0, 0, 0, 0}, //space
{ 0, 125, 0, 0, 0}, //!
{ 0, 112, 0, 112, 0}, //"
}; //have only initialized matrix[0], matrix[1] and matrix[2]
剩余的53行数据虽然归您所有,但我尚未初步确定。所以,当你说:
接下来的五个来自数组矩阵[33] [0到4],因为ASCII'A'= 65和65-32 = 33.然后接下来的五个来自ASCII'B'= 66和66 - 32 = 34因此它们从矩阵[34] [0到4]
发送这表明随机数正好占据了那些未初始化的内存位置,这些内容正在写成:
simple_uart_put(matrix[index2 - 32][bit]);
编辑2 (见评论解释)
这是我的main(),并注释了simple_uart_putstring():
int main()
{
uint8_t *str;
int len=3;
str = malloc(3); //extra char for terminating null byte
strcpy(str, "AB");
simple_uart_putstring(str, 2);
free(str);
}
void simple_uart_putstring(uint8_t *str, uint16_t length)
{
//send data bits
uint_fast8_t index = 0;
uint8_t ch = str[index++]; //ch inits to first char in str, and indexes through
uint_fast8_t bitCount = 0;
int index2 = 0;
int bit = 0;
if (length > 1)
{
while (length >= index)
{
if (bitCount < 2)
{
if (length < 10)
{
//send sync bits
//simple_uart_put(254);
//simple_uart_put(223);
bitCount = 2;
} else {
//send sync bits and add scrolling
//simple_uart_put(254);
//simple_uart_put(222);
bitCount = 2;
}
}
//send each bit for each letter in the string
for (uint_fast8_t i = 0; i < 5; i++)
{
index2 = (int)ch; //
bit = (int)i;
/*simple_uart_put(*/matrix[index2 - 32][bit];//);break here to view "matrix[index2 - 32][bit]"
bitCount++;
}
ch = str[index++]; //
}
//the main controller is expecting 150 bits total to continue to send bit until 150
while (bitCount <= 150)
{
//simple_uart_put(0);
bitCount++;
if(bitCount >= 150)
{
bitCount = 0;
break;
}
}
bitCount = 0;
}
}