TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6748: TMS320C6748基于ndk的tcp例程send函数主动发送数据给客服端

Part Number:TMS320C6748Other Parts Discussed in Thread:SYSBIOS

DSP为C6748,C6748作为服务器,电脑作为客户端;

程序的功能很简单,电脑向C6748发送数据,C6748将接收到的数据回传;

使用NDK实现TCP传输,在TCP.c中,定义了一个全局的套接字TcpSocket和全局变量如下:

volatile UINT8 RecDataFlag=0;   // 数据接收标志位,接收到上位机的数据时:置1;数据处理完:清0。
volatile UINT32 RecDataNum=0; // 接收到的数据的长度
char *RecDataBuf; // 接收到的数据的指针

HANDLE hBuffer;
SOCKET TcpSocket;// 全局套接字

在TCP.c的回调函数TcpTest(SOCKET s, UINT32 unused)中使用send(g_TcpSocket, RecDataBuf, RecDataNum, 0)函数,可以正常的向PC回传数据;我想知道如何将TcpTest(SOCKET s, UINT32 unused)回调函数的套接字s传给全局的套接字TcpSocket;我试过直接赋值如下

TcpTest(SOCKET s, UINT32 unused)

{

………….

TcpSocket=s;

…………

}

//tcp_test_hhr_fun这个是另外一个线程,tcp_test_hhr这个是线程句柄

void tcp_test_hhr_fun(UArg arg)
{
    char Title[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07};
     fdOpenSession((HANDLE)tcp_test_hhr);
    send(tcp_socket, &Title, 4, 0);
    fdCloseSession((HANDLE)tcp_test_hhr);
}

我并不能在另外一个线程发送数据给客服端,我想请问套接字不能直接赋值吗?

啦啦啦:

如果不能这样直接赋值,那应该如何将套接字s给全局的套接字TcpSocket;如果可以这样赋值,我上面错的在哪里,怎么修改呢?

,

Gary Lu:

您好,

根据您提供的代码,您在`TcpTest`函数中尝试将回调函数的套接字`s`赋值给全局套接字`TcpSocket`。但是,这种赋值可能不会生效,因为在回调函数中,套接字`s`的生命周期可能会比全局套接字`TcpSocket`的生命周期短。

要在另一个线程中发送数据给客户端,您可以尝试以下方法:

1. 将全局套接字`TcpSocket`声明为`volatile`类型,以确保其在多个线程中的可见性。

2. 在另一个线程中,使用`TcpSocket`全局套接字发送数据给客户端。确保在发送数据之前,`TcpSocket`已经被正确初始化。

3. 在回调函数`TcpTest`中,将接收到的数据保存到全局变量`RecDataBuf`中,并设置`RecDataFlag`为1,以表示已接收到数据。

请注意,在多线程环境中使用全局变量和套接字时要小心,确保正确地同步和保护共享资源,以避免竞争条件和数据不一致的问题。

,

Gary Lu:

您好,

在多线程环境中,将套接字`s`赋值给全局套接字`TcpSocket`可能会导致竞争条件和数据不一致的问题。为了正确地将套接字`s`传递给全局套接字`TcpSocket`,您可以使用同步机制来保护共享资源。

以下是一种可能的解决方案:

1. 在全局套接字`TcpSocket`之前,声明一个互斥锁,用于保护对`TcpSocket`的访问。例如:

#include <ti/sysbios/gates/GateMutexPri.h>GateMutexPri_Handle tcpSocketMutex;

2. 在程序初始化时,创建互斥锁并初始化全局套接字`TcpSocket`。例如:

tcpSocketMutex = GateMutexPri_create(NULL, NULL);
TcpSocket = INVALID_SOCKET; // 初始化全局套接字

3. 在回调函数`TcpTest`中,使用互斥锁保护对全局套接字`TcpSocket`的访问。例如:

TcpTest(SOCKET s, UINT32 unused)
{
// ...GateMutexPri_enter(tcpSocketMutex);
TcpSocket = s; // 将套接字s赋值给全局套接字TcpSocket
GateMutexPri_leave(tcpSocketMutex);// ...
}
```

4. 在另一个线程中,使用互斥锁保护对全局套接字`TcpSocket`的访问,并发送数据给客户端。例如:

void tcp_test_hhr_fun(UArg arg)
{
char Title[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};fdOpenSession((HANDLE)tcp_test_hhr);GateMutexPri_enter(tcpSocketMutex);
SOCKET s = TcpSocket; // 从全局套接字TcpSocket获取套接字s的副本
GateMutexPri_leave(tcpSocketMutex);if (s != INVALID_SOCKET)
{
send(s, Title, 4, 0); // 使用套接字s发送数据给客户端
}fdCloseSession((HANDLE)tcp_test_hhr);
}

通过使用互斥锁,您可以确保在访问全局套接字`TcpSocket`时只有一个线程可以进行操作,避免了竞争条件和数据不一致的问题。

,

啦啦啦:

感谢大佬指点

,

Gary Lu:

您好,不客气,有问题随时交流,谢谢!

,

啦啦啦:

 大佬,我在添加互斥锁的时候,这一段代码GateMutexPri_leave(tcpSocketMutex);报错这个too few arguments in function call   ,但是我查找些资料,没明白错在什么地方

,

Gary Lu:

您好,

GateMutexPri_leave() 函数是 TI-RTOS 中用于离开互斥锁的函数。根据您提供的错误信息 "too few arguments in function call",这个错误通常表示函数调用时提供的参数数量不正确。

GateMutexPri_leave() 函数的原型如下:

void GateMutexPri_leave(GateMutexPri_Handle handle);

该函数只需要一个参数,即互斥锁的句柄(handle)。因此,如果您在调用 GateMutexPri_leave() 函数时遇到 "too few arguments in function call" 错误,可能是因为您没有提供正确的参数。

请确保您在调用 GateMutexPri_leave() 函数时提供了正确的互斥锁句柄参数。例如,如果您的互斥锁句柄为 `tcpSocketMutex`,则应该这样调用函数:

GateMutexPri_leave(tcpSocketMutex);

如果问题仍然存在,请检查您的代码,确保在调用 GateMutexPri_leave() 函数时没有其他错误,例如语法错误或其他参数问题。

,

啦啦啦:

#define GateMutexPri_leave ti_sysbios_gates_GateMutexPri_leave

xdc__CODESECT(ti_sysbios_gates_GateMutexPri_leave__E, "ti_sysbios_gates_GateMutexPri_leave")__extern xdc_Void ti_sysbios_gates_GateMutexPri_leave__E( ti_sysbios_gates_GateMutexPri_Handle __inst, xdc_IArg key );

我查看了GateMutexPri_leave 的定义,定义里面确实是定义了两个参数,请问第二个参数(xdc_IArg key)应该填什么?

,

Gary Lu:

GateMutexPri_leave函数的第二个参数应该填写一个类型为xdc_IArg的参数key。这个参数是一个无符号整数,用于保存先前获取的关键值,以便在离开临界区时将其恢复。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6748: TMS320C6748基于ndk的tcp例程send函数主动发送数据给客服端
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1