diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for pms-infra-serial
 
+## 0.0.4.0 -- 2025-09-07
+
+* Support invalidChars configs.
+
 ## 0.0.3.0 -- 2025-08-17
 
 * Fixed proc-message.
@@ -7,7 +11,6 @@
 ## 0.0.2.0 -- 2025-07-20
 
 * Added proc tool.
-
 
 ## 0.0.1.0 -- 2025-07-14
 
diff --git a/pms-infra-serial.cabal b/pms-infra-serial.cabal
--- a/pms-infra-serial.cabal
+++ b/pms-infra-serial.cabal
@@ -20,7 +20,7 @@
 -- PVP summary:     +-+------- breaking API changes
 --                  | | +----- non-breaking API additions
 --                  | | | +--- code changes with no API change
-version:            0.0.3.0
+version:            0.0.4.0
 
 -- A short (one-line) description of the package.
 synopsis:           pms-infra-serial
diff --git a/src/PMS/Infra/Serial/DS/Core.hs b/src/PMS/Infra/Serial/DS/Core.hs
--- a/src/PMS/Infra/Serial/DS/Core.hs
+++ b/src/PMS/Infra/Serial/DS/Core.hs
@@ -346,13 +346,15 @@
       tout = DM._TIMEOUT_MICROSEC
   prompts <- view DM.promptsDomainData <$> lift ask
   resQ <- view DM.responseQueueDomainData <$> lift ask
+  invalidChars <- view DM.invalidCharsDomainData <$> lift ask
+  invalidCmds <- view DM.invalidCmdsDomainData <$> lift ask
   serialTMVar <- view handleAppData <$> ask
   lockTMVar <- view lockAppData <$> ask
   argsDat <- liftEither $ eitherDecode $ argsBS
   let args = argsDat^.argumentsSerialStringToolParams
 
   $logDebugS DM._LOGTAG $ T.pack $ "genSerialMessageTask: args. " ++ args
-  return $ serialMessageTask cmdData resQ serialTMVar lockTMVar args prompts tout
+  return $ serialMessageTask cmdData resQ serialTMVar lockTMVar args prompts tout invalidChars invalidCmds
 
 -- |
 --
@@ -363,8 +365,10 @@
                 -> String  -- arguments line
                 -> [String]  -- prompt list
                 -> Int       -- timeout microsec
+                -> [String]  -- pinvalidChars
+                -> [String]  -- invalidCmds
                 -> IOTask ()
-serialMessageTask cmdDat resQ serialTMVar lockTMVar args prompts tout = flip E.catchAny errHdl $ do
+serialMessageTask cmdDat resQ serialTMVar lockTMVar args prompts tout invalidChars invalidCmds = flip E.catchAny errHdl $ do
   hPutStrLn stderr $ "[INFO] PMS.Infra.Serial.DS.Core.serialMessageTask run. " ++ args
     
   STM.atomically (STM.readTMVar serialTMVar) >>= \case
@@ -385,7 +389,7 @@
     go :: Handle -> IO ()
     go serialhdl = do
 
-      msg <- DM.validateMessage args
+      msg <- DM.validateMessage invalidChars invalidCmds args
       let cmd = TE.encodeUtf8 $ T.pack $ msg ++ DM._CR
           waitmicro = 100000
           size = 1024
