CSerialPort串口通信,问题

女神打Boss 2016-11-28 09:36:55
有发送代码
	char s[9];
memset(&s, 0, sizeof(s)); //--清空发送数组缓冲区
s[0] = 0x02;
s[1] = 0x00;
s[2] = 0x04;
s[3] = 0xC1;
s[4] = 0x24;
s[5] = 0x00;
s[6] = 0x00;
s[7] = 0xE3;
s[8] = 0x03;

m_SerialPort.WriteToPort(s, 9);

debug运行点几次发送就崩溃,界面直接关掉
调试点发送没问题,关闭程序时触发错误
_CrtIsValidHeapPointer(const void * pUserData) 行 2036 C++

感觉是CSerialPort的WriteToPort函数有问题 代码
void CSerialPort::WriteToPort(char* string,int n)
{
assert(m_hComm != 0);
m_szWriteBuffer = new char[strlen(string) + 1];
memcpy(m_szWriteBuffer, string, n);
m_nWriteSize = n;

SetEvent(m_hWriteEvent);
}


求大侠指导
...全文
548 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-11-30
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用portmon软件辅助调试串口通讯程序。
女神打Boss 2016-11-30
  • 打赏
  • 举报
回复
求一个 CSerialPort 的关闭串口函数
Saleayas 2016-11-29
  • 打赏
  • 举报
回复
这种传送字节的代码,参数应该是 unsigned char *,并且传递长度。 所以在代码里面不能使用 strlen 这样的函数,不能假定参数是字符串。
zgl7903 2016-11-29
  • 打赏
  • 举报
回复
char s[9 + 1] = {0}; //以0结束 m_szWriteBuffer = new char[/*strlen(string)*/n + 1]; // memcpy(m_szWriteBuffer, string, n); m_szWriteBuffer[n] = 0; m_nWriteSize = n;
深圳背包客 2016-11-29
  • 打赏
  • 举报
回复
这个串口类我用了好多年,串口有数据接收的时候,不停发送数据就会挂掉,我跟踪调试的时候,出问题的函数都是互斥量的系统函数里面,找不到原因。 我把串口内的中动态申请内存的地方都提前申请了,最后退出的时候才释放。
大树学长 2016-11-28
  • 打赏
  • 举报
回复
引用 12 楼 CKRGD 的回复:
[quote=引用 7 楼 shiyanzi 的回复:] 你在InitPort()函数里查一下m_szWriteBuffer 是否有new空间,我怀疑你是重复申请空间了
额,看我11楼的代码改完之后就不会有0楼说的那个问题了 但是,改成这样 操作顺序 打开串口(正常) 发送数据(正常) 接收数据(正常) 关闭串口(正常) 再打开串口(崩溃) 你有这个问题吗?怎么解决的[/quote] 这个类没有关闭串口的函数啊,所有你是怎么关闭的?在连接打开串口后继续打开串口所有会崩溃?
赵4老师 2016-11-28
  • 打赏
  • 举报
回复
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
赵4老师 2016-11-28
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
  • 打赏
  • 举报
回复

void CSerialPort::ClosePort()
{
	if(m_bIsSuspened)
	{
		RestartMonitoring();
	}
	if (m_bThreadAlive)
	{
		MSG message;
		while (m_bThreadAlive)
		{
			//add by liquanhai  防止死锁  2011-11-06
			if(::PeekMessage(&message, m_pOwner->m_hWnd, 0, 0, PM_REMOVE))
			{
				::TranslateMessage(&message);
				::DispatchMessage(&message);
			}
			SetEvent(m_hShutdownEvent);
		}
		TRACE("Thread ended\n");

	}
	if(m_szWriteBuffer != NULL)
	{
		delete [] m_szWriteBuffer;
		m_szWriteBuffer = NULL;
	}

	//if(m_hComm)
	//{
	CloseHandle(m_hComm);
	m_hComm = NULL;
	//}

	// Close Handles  
	if(m_hShutdownEvent!=NULL)
		ResetEvent(m_hShutdownEvent);
	if(m_ov.hEvent!=NULL)
		ResetEvent(m_ov.hEvent);
	if(m_hWriteEvent!=NULL)
		ResetEvent(m_hWriteEvent);

}
你试试这个,不行就按你们经理说的吧
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复
引用 15 楼 shiyanzi 的回复:
关了啊,你把ClosePort()发出来看看

void CSerialPort::ClosePort()
{
		SetEvent(m_hShutdownEvent);
}

/*
void CSerialPort::ClosePort()
{
	do
	{
		SetEvent(m_hShutdownEvent);
	} while (m_bThreadAlive);

	
	// if the port is still opened: close it 
	if (m_hComm != NULL)
	{
		CloseHandle(m_hComm);
		m_hComm = NULL;
	}
	// Close Handles  
	if(m_hShutdownEvent!=NULL)
		CloseHandle( m_hShutdownEvent); 
	if(m_ov.hEvent!=NULL)
		CloseHandle( m_ov.hEvent ); 
	if(m_hWriteEvent!=NULL)
		CloseHandle( m_hWriteEvent ); 

	TRACE("Thread ended\n");
	delete [] m_szWriteBuffer;
}

*/
这2个都不行
  • 打赏
  • 举报
回复
关了啊,你把ClosePort()发出来看看
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复
引用 13 楼 shiyanzi 的回复:
不会啊,你肯定还改了哪里,程序运行大半年了,目前良好,你先断点调试,看看问题出在哪里
你不会是没有关闭过串口吧 我问经理怎么搞,他说串口不关闭就好了
  • 打赏
  • 举报
回复
不会啊,你肯定还改了哪里,程序运行大半年了,目前良好,你先断点调试,看看问题出在哪里
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复
引用 7 楼 shiyanzi 的回复:
你在InitPort()函数里查一下m_szWriteBuffer 是否有new空间,我怀疑你是重复申请空间了
额,看我11楼的代码改完之后就不会有0楼说的那个问题了 但是,改成这样 操作顺序 打开串口(正常) 发送数据(正常) 接收数据(正常) 关闭串口(正常) 再打开串口(崩溃) 你有这个问题吗?怎么解决的
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复

void CSerialPort::WriteToPort(char* string,int n)
{
	assert(m_hComm != 0);
	//m_szWriteBuffer = new char[strlen(string) + 1];
	memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer)); 
	memcpy(m_szWriteBuffer, string, n);
	m_nWriteSize = n;

	SetEvent(m_hWriteEvent);
}
这样好像就可以了,就是这发送函数错误
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复
引用 7 楼 shiyanzi 的回复:
你在InitPort()函数里查一下m_szWriteBuffer 是否有new空间,我怀疑你是重复申请空间了
能否发下你那个serialPort.cpp文件,我上次有个什么问题好像改过这个文件,忘记改哪了 1016286846@qq.com
阿源是少年 2016-11-28
  • 打赏
  • 举报
回复
我做了很久的串口通信,都是直接用win32来搞,自己想怎么做就怎么做,没有那么多奇奇怪怪的问题,所以引用别人的库的时候,需要谨慎
  • 打赏
  • 举报
回复

if (m_szWriteBuffer != NULL)
		delete [] m_szWriteBuffer;
m_szWriteBuffer = new char[writebuffersize];
  • 打赏
  • 举报
回复
你在InitPort()函数里查一下m_szWriteBuffer 是否有new空间,我怀疑你是重复申请空间了
女神打Boss 2016-11-28
  • 打赏
  • 举报
回复
引用 4 楼 shiyanzi 的回复:
我也是用这个类,不过我的 m_szWriteBuffer不在这里分配内存,在InitPort()函数里分配空间的
m_SerialPort.InitPort(this, ic_ncom, ic_port, 'N', 8, 1, m_dwCommEvents, m_bcom) 这个怎么分配内存啊
加载更多回复(6)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧