Wainwright allowed three hits and struck out six before he was lifted after 68 pitches, with 44 strikes.
"Today was a day where I wanted to go in and test where my stuff was at, mix and match all my pitches in there," Wainwright said. "I tried to work in and out, like I would during the regular season, to see what the hitters' reactions were. I was somewhat pleased with where my stuff is now. I just have to hone it in more."
Miami threatened in the first inning, but was unable to cash in. The Marlins put runners on the corners after Juan Pierre's infield single and Donovan Solano's single to right, but Rob Brantly struck out and Austin Kearns tapped into a 6-4-3 double play.
After Solano's single, Wainwright retired eight straight until Solano doubled to lead off the fourth inning.
Solano was 2-for-3, and he's batting .545 on the spring.
Marlins right-hander Jacob Turner was making his second Grapefruit League start. Both have been against the Cardinals. The first outing was troubling, as he gave up six runs in one-third of an inning.
Between appearances, Turner threw in a B game, and his velocity topped at 91 mph. On Saturday, the 21-year-old was in better command of everything. Throwing with more urgency, his fastball topped at 94 mph. For the most part, he pounded the zone, throwing 49 pitches, with 30 strikes.
In three scoreless innings, Turner scattered two hits and one walk. He struck out two -- both against David Freese.
"Obviously, I felt a lot better," Turner said. "I think it showed in just the command of the pitches and how sharp they were. It was a step in the right direction."
Up next: Lefty Jaime Garcia will make his third start of the spring on Sunday, when the Cardinals host the Mets for a 12:05 p.m. CT game. Trevor Rosenthal is also scheduled to appear for St. Louis. This will be Rosenthal's first appearance since the club informed him that he will be groomed for a relief role, not a starting job. Shaun Marcum will start for the Mets.