最近尝试使用从MATLAB端键入输入,将输入值传给DSP,DSP运算之后将结果传回MATLAB并显示。我所设置的PC的IP地址是192.168.2.101,DSP的IP地址是192.168.2.100,端口号是7。DSP作为server端,MATLAB作为client端。
-
MATLAB的TCP/IP通信实现
我所要实现的功能函数有三个输入:T、fa、i,一个输出:H,都是double型的数,也就是每个数的大小是8个字节。从MATLAB端键入的代码及注释如下:
clear all
t = tcpip('192.168.2.100',7, 'NetworkRole', 'client'); %前两个参数是远程主机(DSP)的ip地址和端口,最后一个参数要写MATLAB的NetworkRole
fclose(t); %关闭TCP/IP
t.inputbuffersize=1024; %设置输入缓冲区为1024b,缺省值为512b,根据自己传输的数据大小来调整,不要比传输的数据小
t.outputbuffersize=1024; %设置输出缓冲区为1024b
t.Timeout=30;%最长等待连接的时间
set(t,'ByteOrder','littleEndian'); %设置为小端模式,DSP和MATLAB的字节序应一致避免麻烦
buffer1=input('T='); %在MATLAB键入输入值
buffer2=input('fa=');
buffer3=input('i=');
fopen(t); %连接TCP/IP对象
tic %计时开始
fwrite(t, buffer1,'double'); %将buffer1里的数据以'double'的格式写入t
fwrite(t, buffer2,'double');
fwrite(t, buffer3,'double');
H=fread(t,1,'double'); %以'double'的格式从t里读出1个数据并写入H
toc %计时结束
format longE; %以LongE的格式显示
fprintf('H=%f\n',H); %在MATLAB平台上显示输出值
fclose(t); %关闭TCP/IP
delete(t); %删除TCP/IP
-
DSP的TCP/IP通信实现
我采用的DSP是TI公司的TMS320C6657,CCS采用的是5.5版本,通信例程是在TI官方的helloworld例程的基础上改写的。在编写程序之前,首先要确定自己导入的helloworld例程的products被正确设置,我截取我的例程采用的products如下图:
主要是XDCtools、MCSDK、NDK、SYS/BIOS相互之间以及它们与CCS之间的版本要匹配,TI官网给出了相关的版本要求,如果不满足要求,就会出现编译错误。一开始我没有发现这个问题,版本都是随机下载选择的,出现了很多奇奇怪怪搜索不到的错误,卡了好多天,很难受,大家如果嫌麻烦直接按我这个图上的版本配置就好。
下一步就是对helloworld例程的理解与修改,我采用的是TCP而非UDP,另外我用的是固定IP方式,而非DHCP。helloworld的代码我们主要关注的就是两个,一个是helloWorld.c,这个几乎是TCP/IP通信的模板代码,不管是什么TCP/IP的例程中都会有一个文件与这个文件几乎完全相同,里面主要是EVM_init、StackTest、NetworkOpen、NetworkClose、NetworkIPAddr、 ServiceReport这几个函数。另一个是udpHello.c,这是收发数据的代码。helloworld中还有一个cfg文件,我对它的功能搞得不是很清楚,这个文件我没有动,也没有影响最终的功能的实现。如果有哪位朋友懂的话,希望可以一起讨论下。helloWorld.c的代码与及注释如下,其中中文字体是我改动的地方:
#include <stdio.h>
#include <math.h> //这是我所实现的功能所要用到的库
#include <ti/ndk/inc/netmain.h>
/* BIOS6 include */
#include <ti/sysbios/BIOS.h>
/* Platform utilities include */
#include "ti/platform/platform.h"
#include "ti/platform/resource_mgr.h"
/* Platform Information - we will read it form the Platform Library */
platform_info gPlatformInfo;
//---------------------------------------------------------------------------
// Title String
//
char *VerStr = "\nTCP/IP Stack 'Hello World!' Application\n\n";
// Our NETCTRL callback functions
static void NetworkOpen();
static void NetworkClose();
static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd );
// Fun reporting function
static void ServiceReport( uint Item, uint Status, uint Report, HANDLE hCfgEntry );
// External references
extern int dtask_udp_hello();
//---------------------------------------------------------------------------
// Configuration
//
char *HostName = "tidsp";
char *LocalIPAddr = "192.168.2.100"; //DSP的IP地址
char *LocalIPMask = "255.255.255.0"; // 掩码
char *GatewayIP = "192.168.2.101"; // 网关
char *PCStaticIP = "192.168.2.101"; // PC的IP地址
char *DomainName = "demo.net"; // Not used when using DHCP
char *DNSServer = "0.0.0.0"; // Used when set to anything but zero
/*************************************************************************
* @b EVM_init()
*
* @n
*
* Initializes the platform hardware. This routine is configured to start in
* the evm.cfg configuration file. It