大家好、
我正在研究如何使用 SCI3从外设获取数据、并将接收到的(十六进制)数据保留在数组中(大小为8的字节数组);但是、数组的每个元素都会移位。 我无法解决问题的根源、这种转变的原因是什么?
此致
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我正在研究如何使用 SCI3从外设获取数据、并将接收到的(十六进制)数据保留在数组中(大小为8的字节数组);但是、数组的每个元素都会移位。 我无法解决问题的根源、这种转变的原因是什么?
此致
您好!
我只需使用 sciReceive 代码通过基本使用示例(https://www.youtube.com/watch?v=PpalANwuzIo)获取数据、并将接收到的数据保存在空数组中。
由于这是一个私有任务、我无法共享代码。 如果有任何选项(如用于共享代码的直接消息)、您可以帮助我吗?
此致、
您好、Kardelen、
我关注了您共享的视频、我刚刚配置了与视频中相同的视频、我在最后看不到任何问题

我刚才创建了一个数组来存储来自 SCI 的10个字符。
之后、我刚刚调用"sci_receive"、我将阵列初始化为它、我还提到长度为10。 这样、我将在从 SCI 接收10个字符后获得通知中断。
我正在通知功能中设置一个标志、以指示我的接收操作已完成。 在我的 while (1)循环中、我只是验证该标志以执行一些操作。
我进行了测试、它符合我的要求。 您可以在结束时尝试该项目
e2e.ti.com/.../570LC_5F00_UART_5F00_NEW.zip
--
谢谢、
Jagadish。
您好、Kardelen、
我的代码不同、我配置的视频与您共享的视频相同。
我在代码中更改的内容是 为了满足 您的要求。 我创建了一个用于接收数据的数组、并将该数组传递给具有所需长度(在本例中为10)的接收函数。
我不理解的是、您是从终端提供数据吗?
您必须检查器件管理器、并应在 CCS 的终端窗口中配置相同的端口

我正在共享我的调试视频、请看一下
如果您看一下该视频、在调试开始之前、"rx_data"缓冲区为空。 然后、我使用设备管理器中显示的 XDS 端口配置了终端。 之后、我运行代码、在终端中看到一条消息"请发送数据:"。 之后、我在终端中键入"a 到 j"字母(10个字符)、在"rx_data" 缓冲区的调试窗口中接收到相同的数据。
e2e.ti.com/.../8032.570LC_5F00_UART_5F00_NEW.zip
与之前的代码没有任何变化、只是我添加了一行以向终端发送"请发送数据:"。
--
谢谢、
Jagadish。
您好 Jagadish、
我将您的代码应用到我的、我看到数据不会移位。 但是、修订后 、当我更改发送数据的元素值(十六进 制数组)时、接收到的数组中的数据不会更新。
顺便说一下、我不使用终端来查看接收到的数据、我只是在调试模式下检查数组元素的值(正如您在视频中所做的那样)、并且我从另一个器件读取数据。
问题2:我不理解 sciNotification 的工作原理。 在视频 (https://www.youtube.com/watch?v=PpalANwuzIo)中、他们使用 sciReceive 2次:首先、在主循环中;其次、在 sciNotification 块中。 我知道、sciNotification 是 一个中断、它会针对每个接收到的元素发生。 那么、为什么不在 sciNotification 块中使用它。 请 您更清楚地解释这个问题吗?
此致。
您好!
->我已将代码应用到我的,我看到数据不会移动。
数据永远不会在我们正在传递的"rx_data"缓冲区中移位。

如果您验证"lin1HighLevelInterrupt"函数中存在的上述处理程序代码。 每当控制器 SCI 接收到一个新字符时、处理器就会执行"lin1HighLevelInterrupt"函数、尤其是上面显示的情况11。 在这里、接收到的新字符将被移动到缓冲区指针、即 g_sciTransfer_t[0U].rx_data、在该 Rx 长度递减1之后、缓冲区指针将递增1、以指向我们传递的缓冲区中的新空位置、 如果 Rx 长度不等于零、则它将退出此函数并为下一个字符重复相同的过程。 如果 Rx 长度变为零、则意味着我们接收到配置的字符数、因此在这种情况下、它将调用 sciNotification 函数。
注:
函数"lin1HighLevelInterrupt"正在调用、因为我们在 VIM (矢量中断模块)表中给出了相同的函数名称、这只是向量表中加载函数偏移地址。

另请注意、我们仅启用 RX_INT

因此、每当新的 RX_INT 将被触发并且它调用"lin1HighLevelInterrupt"函数时、 它将根据状态读取中断状态"sciREG1->INTVECT0"、它将执行相应的情况。
--
谢谢、
Jagadish。
您好!
基本上、在 SCI 中、我们有两条线路、 一条用于传输、另一条用于接收

在我们从外部强制短接 Tx 和 Rx (即回路)之前、Tx 和 Rx 之间不会存在任何交叉连接。 两者都将独立工作。
如果您在已发送数据(数组)上写入任何数据并将其指定给"sciSend"函数、则数据将在 SCI 的 Tx 线路上传输。
类似地、如果我们使用"sciReceive 函数调用接收缓冲区、则来自外部设备的任何数据都将通过 Rx 线路移动接收缓冲区。
在我们的测试中、我们将终端窗口连接到外部器件以进行仿真

因此、当我们使用发送缓冲区阵列调用"sciSend"函数时、发送缓冲区阵列中的数据将通过 Tx 线路从控制器移动到终端窗口、接收数据后、终端窗口将显示数据。
类似地、当我们在终端窗口中键入任何数据时、接收到的数据通过 Rx 线路从终端接收缓冲器到控制器。
我希望这澄清了你的疑问。
--
谢谢、
Jagadish。
您好!
我认为我们不是在谈论同一个问题。 让我更清楚地解释一下、我只是从另一个处理器接收数据。 当发送命令发生更改时、在调试时、我看不到接收到的数据数组(在表达式部分)的更改。 我停止调试并重新调试代码、然后可以看到更改。 我的问题是为什么我停止调试以查看更改、因为在应用程序中、我不应停止接收更新数据的过程(我必须同时查看更改)。另一方面、我们不使用终端、因为我们希望确保处理诸如移位、更新等通信问题。
此致。
当然 、我从另一个处理器接收数据。 当发送 的消息(发送到 TMS570LC4357)发生更改时、 我在调试时看不到接收到的数据数组(在表达式部分)的更改。 我停止调试并再次重新调试代码、然后可以看到更改。 我的问题是、为什么我停止调试以获取已更改的接收消息包、因为在应用中、我不应停止接收更新数据的过程(我必须同时查看这些更改)。
另一方面、我们不希望使用终端(只需在调试时检查表达式)、因为我们希望确保解决移位、更新等通信问题。