【问题标题】:Serial communication between GSM module and computerGSM模块与计算机之间的串行通信
【发布时间】:2013-03-11 11:28:51
【问题描述】:

我正在做一个有 GSM 模块的项目,它也在与计算机进行串行通信。

我在 Visual Studio 2010 上用 C 语言编写了一个代码,用于串行传输和接收数据。

代码如下:-

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> 
#include <commdlg.h>
int nread,nwrite;


int main()
{

COMMTIMEOUTS timeouts;
COMMCONFIG dcbSerialParams;
char *words, *buffRead, *buffWrite;
DWORD dwBytesWritten,dwBytesRead;

HANDLE hSerial= CreateFile(L"COM1", GENERIC_READ | GENERIC_WRITE,
                       0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if ( hSerial == INVALID_HANDLE_VALUE) 
{ 
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
printf(" serial port does not exist \n");
} 
printf(" some other error occured. Inform user.\n");
}


//DCB    dcbSerialParams ;
//GetCommState( hSerial, &dcbSerialParams.dcb);
if (!GetCommState(hSerial, &dcbSerialParams.dcb)) 
{
printf("error getting state \n");
}

dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);


dcbSerialParams.dcb.BaudRate = CBR_9600;
dcbSerialParams.dcb.ByteSize = 8;
dcbSerialParams.dcb.StopBits = ONESTOPBIT;
dcbSerialParams.dcb.Parity = NOPARITY;

dcbSerialParams.dcb.fBinary = TRUE;
dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcbSerialParams.dcb.fOutxCtsFlow = FALSE;
dcbSerialParams.dcb.fOutxDsrFlow = FALSE;
dcbSerialParams.dcb.fDsrSensitivity= FALSE;
dcbSerialParams.dcb.fAbortOnError = TRUE;


if (!SetCommState(hSerial, &dcbSerialParams.dcb)) 
{
printf(" error setting serial port state \n");
}


GetCommTimeouts(hSerial,&timeouts);
//COMMTIMEOUTS timeouts = {0};

timeouts.ReadIntervalTimeout = 1000;
timeouts.ReadTotalTimeoutConstant = 1000;
timeouts.ReadTotalTimeoutMultiplier = 1000;
timeouts.WriteTotalTimeoutConstant = 1000;
timeouts.WriteTotalTimeoutMultiplier= 1000;

if(!SetCommTimeouts(hSerial, &timeouts)) 
{
printf("error setting port state \n");
}
while(1)
{
//****************Write Operation*********************//
char data_tx[]="at\r";
words=&data_tx[0];
nwrite = strlen(words);
buffWrite = words;
dwBytesWritten = 0;

if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL)) 
{ 
printf("error writing to output buffer \n");
}
printf("Data written to write buffer is\n %s \n",buffWrite);


//***************Read Operation******************//
dwBytesRead = 0;
nread = strlen(words);
buffRead = new char[nread +1];
memset(buffRead, 0, nread+1);   // ensure that string will be null-terminated

if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL)) 
{
printf("error reading from input buffer \n");
}
printf("Data read from read buffer is \n %s \n ",buffRead);
Sleep(10000);
}
CloseHandle(hSerial);

}

当命令 "at\r" 从计算机传输到 GSM 模块时,它收到它应该通过发送 OK 来响应它。

现在我只得到 O。如果我再次发送 "at\r",我将收到 K

我已经在超级终端上验证了 GSM 模块工作正常。如果我发送 "at" 并输入它以 OK 响应。

此外,我已经在其他程序上验证了我的 C 代码,它工作正常。

我想知道为什么它不能与 GSM 模块一起正常工作。

【问题讨论】:

  • 阅读前检查过nread,阅读后检查过dwBytesRead吗?
  • 这可能会有所帮助:ReadFile only reading one buffer character?
  • @Alex 感谢您的帮助。我已经通过在没有 GSM 模块的情况下在微控制器和计算机之间串行传输和接收 5 个字符的字符串来验证我的代码,并且代码工作正常

标签: c visual-studio-2010 serial-port gsm


【解决方案1】:

您需要在读取结果之前调用 sleep。 250 毫秒绰绰有余

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多