キャリッジリターン付のデータ送信

解決


勉5号  2008-07-11 19:23:06  No: 68693

相変わらず、http://www.alab.t.u-tokyo.ac.jp/~bond/doc/rs232c.html
に記載されているRC232C制御のプログラムをいじくっております。

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200807/08070008.txt  で教えて頂いた続きになるのですが、
以下のソースでRS232Cから「AIUEOaiueo」を出力することはできました(受信側のPCに「AIUEOaiueo」が表示された)。

void CSerialComTestDlg::OnSend() 
{
   char buf[MAX_COM_SIZE];
   strcpy(buf, "AIUEOaiueo");
   int len;
   len=strlen(buf);
   buf[len++]=0x0d; //CR
   buf[len++]=0x0a; //LF
   buf[len]='\0'; //NULL
   com1.Send(buf, len);
}

しかし、最終的には「AIUEOaiueo[CR]」という出力を目的としていましたので、さらに以下のように書き換えましたが、
void CSerialComTestDlg::OnSend() 
{
   char buf[MAX_COM_SIZE];
   strcpy(buf, "AIUEOaiueo");
   int len;
   len=strlen(buf);
   buf[len++]=0x0d; //CR
   com1.Send(buf, len);
}
exeファイルのOnSendのボタンを押すとDebug Assertion Failed!というメッセージが出てきてしまいます。

一方、
void CSerialComTestDlg::OnSend() 
{
   char buf[MAX_COM_SIZE];
   strcpy(buf, "AIUEOaiueo");
   int len;
   len=strlen(buf);
   buf[len++]=0x0d; //CR
   buf[len]='\0'; //NULL
   com1.Send(buf, len);
}
とすると、受信側のPCには「AIUEOaiueo」が表示されました。しかし、RS232Cを制御対象の実機に繋げると、実機が「AIUEOaiueo[CR]」が指し示す動作をしません。つまり、「AIUEOaiueo[CR]」の[CR]部分がうまく出力されてないのではないかと思います。。。上記のソースをどのように書き換えれば、「AIUEOaiueo[CR]」という出力が可能になりますでしょうか?また、strcpy(buf, "AIUEOaiueo");において、ヌル文字はbuf[10]に付け加えられているのでしょうか?さらに、私が示した一番上のソースの送信データは「AIUEOaiueo[CR][LF][NULL]」になっているのでしょうか?

長々と書いてしまいましたが、宜しくお願い致します。


ん?  2008-07-11 21:57:00  No: 68694

// バッファ内のデータ確認
INT CheckLen = strlen(buf) + 1;
INT cnt;
for(cnt = 0; cnt < CheckLen; cnt++) {
    TRACE("[%d]:%c\n", cnt, buf[cnt]);
}

com1.Send(buf, len); の直前にでも入れて、自身で確認してみて下さい。


勉5号  2008-07-12 19:53:35  No: 68695

ん?さん,返信ありがとうございます.
今回はじめてTRACEとDEBUGの関係というか機能を知りました...

教えていただいたとおり試してみましたところ,(二度同じボタンを押しました.「AIUEOaiueo」の変わりに「SPD 100」としました.)
(以上省略)WriteTotalCons=100CRs232cCtl::ReceiveThread start[0]:S
[1]:P
[2]:D
[3]: 
[4]:1
[5]:0
[6]:0
[7]:
[8]:CRs232cCTl::OnSend (SPD 100)[0]:S
[1]:P
[2]:D
[3]: 
[4]:1
[5]:0
[6]:0
[7]:
[8]:CRs232cCTl::OnSend (SPD 100)The program has exited with code 0 (0x0).
とデバッグに表示されました.

これをみると,[0]〜[6]までは送りたい文字がきちんと入っているようですが,[7]にはキャリッジリターンが入っている場合は,どのように表示されるのでしょうか?また,[8]CRs232cCTl::OnSend (SPD 100)は,なぜ出てきたのでしょうか?

宜しくお願いします.


ん?  2008-07-12 20:37:49  No: 68696

>[7]にはキャリッジリターンが入っている場合は,どのように表示されるのでしょうか?
人が見てもわからないような制御コードが表示されます。
ので、次の様に変更してみて下さい。
    TRACE("[%d]:%c\n", cnt, buf[cnt]);
      ↓
    TRACE("[%d]:0x%02x\n", cnt, (UCHAR)buf[cnt]);

# こんな事せずとも com1.Send(buf, len); で ブレイクポイントを設定して
# 実行すると、自動変数やローカルのウインドウにbufの内容が表示されて
# いる筈なんだが…。


勉5号  2008-07-12 21:34:03  No: 68697

ん?さん,ありがとうございます.
教えていただいたように変更したら以下のようになりました.

[0]:0x53
[1]:0x50
[2]:0x44
[3]:0x20
[4]:0x31
[5]:0x30
[6]:0x30
[7]:0x0d
[8]:0x00
CRs232cCTl::OnSend (SPD 100)[0]:0x53

[7]にはキャリッジリターンが入っていたようです!ただ,[8]が余計なので消したいのですが,以下のようなソースにすると,

void CSerialComTestDlg::OnSend() 
{
   char buf[MAX_COM_SIZE];
   strcpy(buf, "AIUEOaiueo");
   int len;
   len=strlen(buf);
   buf[len++]=0x0d; //CR
   com1.Send(buf, len);
}
exeファイルのOnSendのボタンを押すと,dumpout.cppというファイルでDebug Assertion Failed!というメッセージが出てきてしまいます。これを解決するにはどうしたらよいでしょうか?

以下のdumpout.cppをみてみましたが,エラーの原因が分かりませんでした...

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"
#include <stdarg.h>

#ifdef _DEBUG   // entire file

#ifdef AFX_AUX_SEG
#pragma code_seg(AFX_AUX_SEG)
#endif

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Helper routines that can be called from debugger

void AFXAPI AfxDump(const CObject* pOb)
{
  afxDump << pOb;
}

/////////////////////////////////////////////////////////////////////////////
// Diagnostic Trace

void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
  if (!afxTraceEnabled)
    return;
#endif

  va_list args;
  va_start(args, lpszFormat);

  int nBuf;
  TCHAR szBuffer[512];

  nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);

  // was there an error? was the expanded string too long?
  ASSERT(nBuf >= 0);    //ここでDebug Assertion Failed!です

  if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
    afxDump << AfxGetApp()->m_pszExeName << ": ";
  afxDump << szBuffer;

  va_end(args);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////


勉5号  2008-07-13 01:19:50  No: 68698

データ送信できました.
以下のソースのままで,うまくいきました.今回は実機の方に問題がありました...

void CSerialComTestDlg::OnSend() 
{
   char buf[MAX_COM_SIZE];
   strcpy(buf, "AIUEOaiueo");
   int len;
   len=strlen(buf);
   buf[len++]=0x0d; //CR
   buf[len]='\0'; //NULL
   com1.Send(buf, len);
}

おかげさまで,キャリッジリターンとかヌル文字とかのよい勉強になりました.ヌル文字は最後に付けないと,変数のデータがどこで終わるか分からないのですね...

ありがとうございました.


ん?  2008-07-13 01:53:18  No: 68699

>ヌル文字は最後に付けないと,変数のデータがどこで終わるか分からないのですね...
それが文字列ですので、十分理解が必要になります。
(参考までに…) http://www2.netf.org/pointer3.html


勉5号  2008-07-13 04:05:29  No: 68700

ん?さん,分かりやすいページですね.
ありがとうございますm(--)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加