123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- #include <stdint.h>
- #include <stdio.h> //用于输入、输出函数的调用,printf, gets
- #include <winsock2.h> //socket头文件
- #include <Windows.h> //为了方便调试,所以加入了等待2秒才进行连接server,这里用到了sleep函数
- #include "Comm.h"
- #include "mbmsg.h"
- #include "mbphy.h"
- #pragma comment (lib, "ws2_32") //socket库文件
- static char _IP[32] = "192.168.100.100";
- static int _Port;
- static int _DevID = 0;
- static HANDLE _hComm;
- static char _strComm[32] = "";
- static uint32_t _Baud = 19200;
- static uint8_t _RxBuff[512];
- static uint16_t _RxSize;
- static uint8_t _TxBuff[512];
- static uint16_t _TxSize;
- static pfcbSTK_t _cbOut = 0;
- static pfcbSTK_t _cbIn = 0;
- int8_t MB_STK_Out(uint8_t * pBuff, uint16_t Size);
- /*
- 选择物理设备
- */
- void MB_PHY_SelPHY(int ID)
- {
- _DevID = ID;
- }
- /*
- 设置IP地址和端口
- */
- void MB_PHY_SetIP(const char * IP, int Port)
- {
- strcpy(_IP, IP);
- _Port = Port;
- MB_STK_SetOutCallback(MB_STK_Out);
- }
- /*
- 设置串口号和波特率
- */
- void MB_PHY_SetBaud(const char * CommName, int Baud)
- {
- strcpy(_strComm, CommName);
- _Baud = Baud;
- MB_STK_SetOutCallback(MB_STK_Out);
- }
- /*设置输入输出回调*/
- void MB_PHY_SetCallback(pfcbSTK_t cbOut, pfcbSTK_t cbIn)
- {
- _cbOut = cbOut;
- _cbIn = cbIn;
- }
- #if 0
- void Connect(void)
- {
- WSADATA wsd;
- SOCKET cClient;
- int ret;
- struct sockaddr_in server;
- hostent *host = NULL;
- if (WSAStartup(MAKEWORD(2, 0), &wsd)){ return 0; }
- cClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (cClient == INVALID_SOCKET){ return 0; }
- //set Recv and Send time out
- int TimeOut = 6000; //设置发送超时6秒
- if (setsockopt(cClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR){
- return 0;
- }
- TimeOut = 6000;//设置接收超时6秒
- if (setsockopt(cClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR){
- return 0;
- }
- //设置非阻塞方式连接
- unsigned long ul = 1;
- ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
- if (ret == SOCKET_ERROR)return 0;
- //连接
- server.sin_family = AF_INET;
- server.sin_port = htons(25);
- server.sin_addr.s_addr = inet_addr((LPCSTR)pSmtp);
- if (server.sin_addr.s_addr == INADDR_NONE){ return 0; }
- connect(cClient, (const struct sockaddr *)&server, sizeof(server));
- //select 模型,即设置超时
- struct timeval timeout;
- fd_set r;
- FD_ZERO(&r);
- FD_SET(cClient, &r);
- timeout.tv_sec = 15; //连接超时15秒
- timeout.tv_usec = 0;
- ret = select(0, 0, &r, 0, &timeout);
- if (ret <= 0)
- {
- closesocket(cClient);
- return 0;
- }
- //一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
- unsigned long ul1 = 0;
- ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
- if (ret == SOCKET_ERROR){
- closesocket(cClient);
- return 0;
- }
- }
- #endif
- #if 0
- /*
- 收发数据
- */
- int8_t MB_PHY_TCP_SendReceve(uint8_t * pBuff, uint16_t Size, uint8_t * pRBuff, uint16_t *pRSize)
- {
- WSADATA wd;
- int ret = 0;
- static SOCKET c = 0;
- SOCKADDR_IN saddr;
- uint8_t recvBuf[1000];
- /*1.初始化操作*/
- ret = WSAStartup(MAKEWORD(2, 2), &wd);
- if (ret != 0) {
- return -1;
- }
- if (HIBYTE(wd.wVersion) != 2 || LOBYTE(wd.wVersion) != 2) {
- WSACleanup();
- return -1;
- }
- if (c == 0) {
- /*2.创建客户端socket*/
- c = socket(AF_INET, SOCK_STREAM, 0);
- int nNetTimeout = 2000;
- if (SOCKET_ERROR == setsockopt(c, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)))
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- if (SOCKET_ERROR == setsockopt(c, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int)))
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- /*3.定义要连接的服务端信息*/
- saddr.sin_addr.S_un.S_addr = inet_addr(_IP);
- saddr.sin_family = AF_INET;
- saddr.sin_port = htons(_Port);
- /*4.连接服务端*/
- ret = connect(c, (SOCKADDR*)&saddr, sizeof(SOCKADDR));
- if (ret != 0)
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- }
- /*5。发送数据到服务器*/
- ret = send(c, pBuff, Size, 0);
- if (ret == SOCKET_ERROR) {
- //closesocket(c);
- WSACleanup();
- return -1;
- }
- /*6.接受服务器的返回*/
- ret = recv(c, recvBuf, sizeof(recvBuf), 0);
- if (ret != SOCKET_ERROR) {
- if (pRBuff) {
- memcpy(pRBuff, recvBuf, ret);
- if (pRSize) {
- *pRSize = ret;
- }
- }
- memcpy(_RxBuff, recvBuf, ret);
- _RxSize = ret;
- if (_cbIn) {
- _cbIn(_RxBuff, _RxSize);
- }
- MB_STK_In(recvBuf, ret);
- }
- //closesocket(c);
- //WSACleanup();
- return 0;
- }
- #else
- /*
- 收发数据
- */
- int8_t MB_PHY_TCP_SendReceve(uint8_t * pBuff, uint16_t Size, uint8_t * pRBuff, uint16_t *pRSize)
- {
- WSADATA wd;
- int ret = 0;
- SOCKET c = 0;
- SOCKADDR_IN saddr;
- uint8_t recvBuf[1000];
- /*1.初始化操作*/
- ret = WSAStartup(MAKEWORD(2, 2), &wd);
- if (ret != 0) {
- return -1;
- }
- if (HIBYTE(wd.wVersion) != 2 || LOBYTE(wd.wVersion) != 2) {
- WSACleanup();
- return -1;
- }
- /*2.创建客户端socket*/
- c = socket(AF_INET, SOCK_STREAM, 0);
- int nNetTimeout = 2000;
- if (SOCKET_ERROR == setsockopt(c, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)))
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- if (SOCKET_ERROR == setsockopt(c, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int)))
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- /*3.定义要连接的服务端信息*/
- saddr.sin_addr.S_un.S_addr = inet_addr(_IP);
- saddr.sin_family = AF_INET;
- saddr.sin_port = htons(_Port);
- /*4.连接服务端*/
- ret = connect(c, (SOCKADDR*)&saddr, sizeof(SOCKADDR));
- if (ret != 0)
- {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- /*5。发送数据到服务器*/
- ret = send(c, pBuff, Size, 0);
- if (ret == SOCKET_ERROR) {
- closesocket(c);
- WSACleanup();
- return -1;
- }
- /*6.接受服务器的返回*/
- ret = recv(c, recvBuf, sizeof(recvBuf), 0);
- if (ret != SOCKET_ERROR) {
- if (pRBuff) {
- memcpy(pRBuff, recvBuf, ret);
- if (pRSize) {
- *pRSize = ret;
- }
- }
- memcpy(_RxBuff, recvBuf, ret);
- _RxSize = ret;
- if (_cbIn) {
- _cbIn(_RxBuff, _RxSize);
- }
- MB_STK_In(recvBuf, ret);
- }
- closesocket(c);
- WSACleanup();
- return 0;
- }
- #endif
- int8_t MB_PHY_UDP_SendReceve(uint8_t * pBuff, uint16_t Size, uint8_t * pRBuff, uint16_t *pRSize)
- {
- WSADATA wd;
- int ret = 0;
- static SOCKET c = 0;
- SOCKADDR_IN saddr;
- uint8_t recvBuf[1000];
- /*1.初始化操作*/
- ret = WSAStartup(MAKEWORD(2, 2), &wd);
- if (ret != 0) {
- return -1;
- }
- if (HIBYTE(wd.wVersion) != 2 || LOBYTE(wd.wVersion) != 2) {
- WSACleanup();
- return -1;
- }
- /*2.创建客户端socket*/
- if (c == 0) {
- c = socket(AF_INET, SOCK_DGRAM, 0);
- }
- /*5。发送数据到服务器*/
- saddr.sin_addr.S_un.S_addr = inet_addr(_IP);
- saddr.sin_family = AF_INET;
- saddr.sin_port = htons(_Port);
- sendto(c, pBuff, Size, 0, (SOCKADDR*)&saddr, sizeof(SOCKADDR));
-
- /*6.接受服务器的返回*/
- ret = recvfrom(c, recvBuf, sizeof(recvBuf), 0, 0, 0);
- if (ret != SOCKET_ERROR) {
- if (pRBuff) {
- memcpy(pRBuff, recvBuf, ret);
- if (pRSize) {
- *pRSize = ret;
- }
- }
- memcpy(_RxBuff, recvBuf, ret);
- _RxSize = ret;
- if (_cbIn) {
- _cbIn(_RxBuff, _RxSize);
- }
- MB_STK_In(recvBuf, ret);
- }
- return 0;
- }
- /*
- 协议栈数据输出
- */
- int8_t MB_STK_OutEx(uint8_t * pBuff, uint16_t Size,uint8_t * pRBuff,uint16_t *pRSize)
- {
- int MsgSizeMax;
- int TimeConst;
- //memcpy(_TxBuff, pBuff, Size);
- //_TxSize = Size;
- if (_cbOut) {
- _cbOut(pBuff, Size);
- }
- switch (_DevID) {
- case 0:
- return MB_PHY_TCP_SendReceve(pBuff, Size, pRBuff, pRSize);
- case 2:
- return MB_PHY_UDP_SendReceve(pBuff, Size, pRBuff, pRSize);
- case 1:
- MsgSizeMax = sizeof(MB_MSG_T)+5;
- TimeConst = (MsgSizeMax * 1000 / _Baud) + 200;/*通信时间 加上 设备的处理时间(预留200MS)*/
- _hComm = COMM_OpenEx3(_strComm, _Baud, 8, NOPARITY, ONESTOPBIT, TimeConst, 0, 5, 1000, 2, 0);
- if (_hComm == 0) {
- return -1;
- }
- Sleep(5);
- //PurgeComm(_hComm, PURGE_TXCLEAR | PURGE_TXABORT);
- //PurgeComm(_hComm, PURGE_RXCLEAR | PURGE_RXABORT);
- COMM_Write(_hComm, pBuff, Size);
- uint32_t rSize = COMM_Read(_hComm, _RxBuff, MsgSizeMax);
- MB_STK_In(_RxBuff, rSize);
- if (pRBuff && rSize) {
- memcpy(pRBuff, _RxBuff, rSize);
- if (pRSize) {
- *pRSize = rSize;
- }
- _RxSize = rSize;
- if (_cbIn) {
- _cbIn(_RxBuff, _RxSize);
- }
- }
- COMM_Close(&_hComm);
- return 0;
- }
- return -1;
- }
- /*
- 协议栈数据输出
- */
- int8_t MB_STK_Out(uint8_t * pBuff, uint16_t Size)
- {
- return MB_STK_OutEx(pBuff, Size, 0, 0);
- }
|